在regex中指定优先子模式

时间:2013-08-25 19:27:40

标签: php regex

我需要指定首选的可选子模式,但允许备份。不幸的是,两者都共享一个模式的一部分,并且优先匹配在之后。例如:

$string = "Fuzzy bunny is bald";
preg_match_all('@(?:bunny is (\w+)|(\w+) bunny)@',$string,$result);

预期的行为是仅仅匹配“bald”,除非它不能,在这种情况下它应匹配“模糊”,但是因为它首先遇到与“模糊”的匹配,它反过来。

感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

想通了。必须在首选子模式中指定非首选项的捕获部分,只是不捕获它,以便它可以同时看到它们。然后按首选顺序列出它们。例如:

'@(?:\ w + bunny是(\ w +)|(\ w +)bunny)@'

答案 1 :(得分:0)

你可以试试这个:

$strings = array("Fuzzy bunny is bald", "Fuzzy bunny is");
$pattern = '~(?J)^(?(?=^[^b]*+bunny is \w++)^[^b]+bunny is (?<word>\w++)|(?<word>\w++) bunny)~';
foreach ($strings as $k => $string) {
    if (preg_match($pattern, $string, $match))
        echo "<br/>string$k : " . $match['word'] . "\n";
}

或者这个:

$pattern='~(?|(\w++) si ynnub|ynnub (\w++))~';
foreach ($strings as $k => $string) {
    if (preg_match($pattern, strrev($string), $match))
        echo "<br/>string$k : " . strrev($match[1]) . "\n";
}