StepCoding

Quantifiers และ Greed

อ่าน [1587] หมวดหมู่: Perl-Compatible

Quantifier ใน POSIX นั้นส่วนมากจะเป็นแบบ greed ซึ่งหมายความว่าเมื่อเรากำหนด quantifier ใน pattern นั้น ๆ มันจะทำการ match กับข้อความมากเท่าที่มันจะตรวจสอบได้ เช่น

<?php
$bool = preg_match('/(<.*>/', '<b>PHP</b> Programming', $match);
// true, $match = array('<b>PHP</b> Programming', '<b>PHP</b>')
?>

จากตัวอย่างจะเห็นว่ามันจะทำการ match กับ > ตัวหลังสุดเท่าที่มันจะตรวจสอบเจอ ซึ่งในกรณีนี้ถ้าเราต้องการเอาแค่ <b> ออกมา จะต้องทำการกำหนด quantifier แบบ non-greed ซึ่งการกำหนด quantifier แบบ greed กับ non-greed ต่างกันตรงที่ non-greed จะมีสัญลักษณ์ ? ตามหลัง quantifier นั้น ๆ เราไปดูตารางกันเลยครับ

Greedy quantifierNon-greedy quantifier
???
**?
++?
{m}{m}?
{m, }{m, }?
{m, n}{m,n}?

เราไปดูครับว่าถ้าเราใช้ quantifier แบบ non-greed มันจะสามารถเอาค่าเฉพาะ <b> ได้อย่างไร

<?php
$bool = preg_match('/(<.*?>)/', '<b>PHP</b> Programming', $match);
// true, $match[1] = "<b>"
?>

ผู้สนับสนุน