1

我需要指定一个首选的可选子模式,但允许备份。不幸的是,两者共享模式的一部分,然后是首选匹配。前任:

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

预期的行为是只匹配“bald”,除非它不能匹配,在这种情况下它应该匹配“Fuzzy”,但是因为它首先遇到与“Fuzzy”的匹配,所以它会反过来。

谢谢你的帮助。

4

2 回答 2

2

弄清楚了。必须在首选子模式内指定非首选的捕获部分,只是不捕获它,以便它可以同时看到它们。然后按首选顺序列出它们。前任:

'@(?:\w+ 兔子是 (\w+)|(\w+) 兔子)@'

于 2013-08-25T19:30:34.247 回答
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";
}
于 2013-08-25T20:07:55.680 回答