我需要指定首选的可选子模式,但允许备份。不幸的是,两者都共享一个模式的一部分,并且优先匹配在之后。例如:
$string = "Fuzzy bunny is bald";
preg_match_all('@(?:bunny is (\w+)|(\w+) bunny)@',$string,$result);
预期的行为是仅仅匹配“bald”,除非它不能,在这种情况下它应匹配“模糊”,但是因为它首先遇到与“模糊”的匹配,它反过来。
感谢您的帮助。
答案 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";
}