如何用PHP的preg_match_all匹配起始词到多个终止词之间的内容
问题原因
你编写的代码不生效是因为将正则的或运算符|传入了preg_quote()函数中,preg_quote()会自动转义正则语法符号,最终$word2|$word3会被转义为普通字符串Monkey\|Dog,无法实现二选一匹配的逻辑。
正确实现方案
你需要分别对两个结束词做转义处理,再用正则或语法拼接,示例代码如下:
<?php $sting= "Rabbit Cat Monkey Dog Fox Cow Rabbit Fish Monkey"; $word1 = "Rabbit"; $word2 = "Monkey"; $word3 = "Dog"; // 分别转义两个结束词,用非捕获分组实现二选一匹配 preg_match_all('/'.preg_quote($word1).'(.*?)(?:'.preg_quote($word2).'|'.preg_quote($word3).')/is', $sting, $matches); print_r($matches[0]); ?>
匹配结果说明
- 正则中的非贪婪匹配
.*?会自动匹配到$word2和$word3中先出现的那个词就停止,刚好满足你的需求 - 上述代码输出结果为:
Array ( [0] => Rabbit Cat Monkey [1] => Rabbit Fish Monkey )
如果调整字符串为Rabbit Cat Dog Monkey,则第一个匹配结果会自动变成Rabbit Cat Dog,符合“匹配先出现的结束词”的要求。
内容的提问来源于stack exchange,提问作者Sam Samani
相关产品推荐
相关产品推荐

