PHP正则表达式以给定字符串开头和结尾

4

我有一个字符串,类似于这样的格式:05/15/2015 09:19 PM pt_Product2017.9.abc.swl.px64_kor_7700。我需要从中选出符合条件的pt_Product2017.9.abc.swl.px64_kor。(以pt_开头以_kor结尾)

$str = "05/15/2015 09:19 PM pt_Product2017.9.abc.swl.px64_kor_7700";
preg_match('/^pt_*_kor$/',$str, $matches);

但是它不起作用。
3个回答

8
您需要删除锚点,添加 \b 以匹配前面有非单词字符的 pt_,并使用 \S 结合 *\S 简写字符类可匹配任何非空格字符):
preg_match('/\bpt_\S*_kor/',$str, $matches);

请参见正则表达式演示

在你的正则表达式中,^$强制正则引擎在字符串开头搜索pt,在字符串结尾搜索_kor,而_*匹配0个或多个下划线。请注意,正则表达式模式通配符不同。

如果pt__kor之间可以有空格,请使用.*

preg_match('/\bpt_.*_kor/',$str, $matches);

我应该提到的是贪婪性:如果你有pt_something_kor_more_kor,那么.*/\S*将匹配整个字符串,但.*?/\S*?将仅匹配pt_something_kor。请根据您的要求进行调整。

3
+1 我很高兴你修改了这个答案并解释了为什么正则表达式是错误的,因为这将对更多人包括提问者更有用。 - Ash

1

^$分别代表字符串的开头和结尾,而不仅限于匹配的部分。因此,只需使用简单的(pt_.+_kor)即可匹配pt__kor之间的所有内容:preg_match('/(pt_+_kor)/',$str, $matches);

以下是演示: https://regex101.com/r/qL4fW9/1


1
你所使用的正则表达式中的^$表示字符串应该以pt开头,并以kor结尾。但实际上,它既不是以这种方式开头,也不是以kor结尾(事实上,以kor_7700结尾)。尝试删除^$,你将得到匹配结果:
preg_match('/pt_.*_kor/',$str, $matches);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接