PHP preg_match named back references

\k<named>

ใน Regular expression ที่ใช้ในฟังก์ชั่น preg ของ PHP ปกติจะสามารถใช้ \1 \2 \3 อะไรงี้ เพื่ออ้างอิงถึงใน ( ) ที่เจอก่อนหน้าได้เลย แต่ถ้าตัว regex มีความซับซ้อนมากๆ จะมานั่งนับกันคงไม่สะดวก ยิ่งถ้ามีการแก้ไข เพิ่ม หรือลด ( ) เข้าไปแล้วละก็ เท่ากับตัวไล่ลำดับ sub pattern กันใหม่

ใน regex ของ PHP เราสามารถตั้งชื่อ sub pattern ได้โดยกำหนดลักษณะนี้

<?php
$input_text = '$hash = "6123eac44792571853043a43248e3c93";'. "\n";
preg_match('/(?<var>\$[a-z0-9_]+) = /', $input_text, $matches);
print_r($matches);

Output:

Array
(
    [0] => $hash = 
    [var] => $hash
    [1] => $hash
)

ทีนี้เวลาเราจะ Back references กับ sub-pattern ข้างหน้าที่ชื่อว่า var เราก็สามารถอ้างอิงโดยใช \k<var> แบบนี้

<?php
$input_text = '$hash = "6123eac44792571853043a43248e3c93";'. "\n";
$input_text.= 'if (check_hash($hash)) {';
preg_match('/(?<var>\$[a-z0-9_]+) = .*check_hash\(\k<var>\)/ms', $input_text, $matches);
print_r($matches);

Output:

Array
(
    [0] => $hash = "6123eac44792571853043a43248e3c93";
if (check_hash($hash)
    [var] => $hash
    [1] => $hash
)

อ้างอิง: http://www.rexegg.com/regex-capture.html#namedgroups

Leave a Reply

Your email address will not be published. Required fields are marked *