Lookahead ใน Regular Expressions PHP
บางครั้งจำเป็นต้องแก้ปัญหาประเภทนี้: หา
สตริง 'aaa' และแทนที่ด้วย '!',
แต่เฉพาะในกรณีที่หลัง 'aaa' มี
'x', โดยตัว 'x' เองนั้น
ไม่ต้องแทนที่ หากเราพยายามแก้ปัญหาแบบ
'ตรงไปตรงมา' เราจะทำไม่ได้:
<?php
preg_replace('#aaax#', '!', 'aaax'); // จะได้ '!' แต่ต้องการ '!x'
?>
สำหรับการแก้ปัญหา จำเป็นต้องมีวิธีบอกว่า
'x' ไม่ควรถูกแทนที่ ทำได้
โดยใช้วงเล็บพิเศษ (?= ),
ซึ่งเพียงแค่ "มอง" แต่ไม่ดึงส่วนนั้นมาด้วย
วงเล็บเหล่านี้เรียกว่า Positive Lookahead
(การมองไปข้างหน้าแบบมีเงื่อนไขบวก) Positive - เพราะ 'x'
(ในกรณีของเรา) ต้องมี - เฉพาะตอนนั้น
การแทนที่จึงจะเกิดขึ้น
ลองใช้วงเล็บเหล่านี้เพื่อแก้ปัญหา ของเราดู:
<?php
preg_replace('#aaa(?=x)#', '!', 'aaax'); // คืนค่า '!x'
?>
นอกจากนี้ยังมี Negative Lookahead
(การมองไปข้างหน้าแบบมีเงื่อนไขลบ)
- (?! ) - มันบอกในทางกลับกัน ว่า
บางสิ่งต้องไม่มี ในตัวอย่างต่อไปนี้
การแทนที่จะเกิดขึ้น เฉพาะเมื่อหลัง 'aaa'
ไม่มี 'x':
<?php
preg_replace('#aaa(?!x)#', '!', 'aaab'); // คืนค่า '!b'
?>
กำหนดสตริงที่มีชื่อฟังก์ชัน:
<?php
$str = 'func1() func2() func3()';
?>
ให้รับอาร์เรย์ของชื่อฟังก์ชันจากสตริง
กำหนดสตริงที่มีแท็ก:
<?php
$str = '<a href="" class="eee" id="zzz">';
?>
ให้รับอาร์เรย์ของชื่อแอตทริบิวต์ของแท็กนี้