如何使用preg_match匹配中间含任意数量单词的相似文本模式?
解决"Where"与"find train station"间任意多单词的正则匹配问题
嘿,你的问题根源在于原正则的匹配范围太窄啦!原表达式里的([^\s]+)只能匹配单个不含空格的单词,所以当中间有多个单词时自然就匹配失败了。
要实现匹配中间一个或多个单词的需求,我们可以调整正则规则,让它能覆盖任意数量的单词(包括单词间的空格)。这里给你两种可行的方案:
方案1:灵活匹配(允许中间有任意字符,适合大多数场景)
用非贪婪模式的.+?来匹配"Where"和"find train station"之间的所有内容,简单直接:
$lines = "Where can I find train station"; $pattern = "/Where (.+?) find train station/i"; preg_match($pattern, $lines, $matches); var_dump($matches); // 输出:array(2) { [0]=> string(29) "Where can I find train station" [1]=> string(5) "can I" }
方案2:精准匹配(仅匹配单词,排除特殊字符)
如果你需要严格只匹配字母数字组成的单词,可以用非捕获组来组合"单词+空格"的模式,确保只捕获合法单词:
$lines = "Where can i and you and me find train station"; // (?:\w+\s+)* 匹配零次或多次"单词+空格",最后用\w+匹配结尾的单词 $pattern = "/Where ((?:\w+\s+)*\w+) find train station/i"; preg_match($pattern, $lines, $matches); var_dump($matches); // 输出:array(2) { [0]=> string(45) "Where can i and you and me find train station" [1]=> string(21) "can i and you and me" }
关键修改点说明:
- 保留
i修饰符,实现大小写不敏感匹配,比如能匹配"Where Can I..."或者"where CAN i..." - 方案1的
.+?是非贪婪匹配,会在遇到第一个"find train station"时停止,避免匹配过多内容 - 方案2的
(?:...)是非捕获组,不会额外生成捕获结果,只用来组合匹配规则,让捕获组只保留我们需要的中间单词内容
这两个方案都能完美支持你提到的所有测试场景,包括中间1个单词、多个单词的情况,你可以根据实际需求选择~
内容的提问来源于stack exchange,提问作者user1343837
相关产品推荐
相关产品推荐

