假设我们有3个字符串:
lorem,ipsum,set
和代码,输入字符串和预期结果是:
$array = array(
"lorem" => "lorem",
"loremipsum" => "loremipsum",
"loremipsumset" => "FOUND!",
"abc loremipsumset xyz" => "abc FOUND! xyz",
"ipsumsetlorem" => "FOUND!",
"ipsumloremset" => "FOUND!",
"setipsumloremsetset" => "FOUND!",
"loremloremipsumipsumsetset" => "FOUND!", // tough one...
"lorem ipsum set" => "lorem ipsum set",
) ;
foreach ($array as $string => $expect) {
$result preg_replace($REGEX,'FOUND!','abacdaef');
echo ($result == $expect ? 'THANKS!!' : '...') ;
echo '<br>' ;
}
在给定的输入中,三个字符串必须在一起,但是任何顺序......
"/((lorem|ipsum|set)+(lorem|ipsum|set)+(lorem|ipsum|set)+)+/"
这会以某种方式起作用,但它也与“loremloremlorem”匹配,
什么样的正则表达式可以处理?还是有简单的方法吗?
答案 0 :(得分:1)
你可以这样做。
Php支持条件。如果你在每个单词周围设置一个警卫
匹配,它将强制引擎至少匹配所有这些。
https://regex101.com/r/fL1fR0/3
添加另一个字符串:
| ((?(4)(?!))new string)
(?: lorem | ipsum | set | new string)
{4}
这匹配数组中替换FOUND的所有位置。
\b(?:(?:((?(1)(?!))lorem)|((?(2)(?!))ipsum)|((?(3)(?!))set))(?:lorem|ipsum|set)*){3}\b
扩展
\b
(?:
(?:
( # (1)
(?(1)
(?!)
)
lorem
)
| ( # (2)
(?(2)
(?!)
)
ipsum
)
| ( # (3)
(?(3)
(?!)
)
set
)
)
(?: lorem | ipsum | set )*
){3}
\b