用于检查单个并发到preg_match_all的模式

时间:2017-03-15 16:01:48

标签: php regex preg-match-all

我正在编写一个应该检索我传递的所有事件的函数。 我是意大利人,所以我认为我可以通过一个例子更清楚。 我会检查我的短语是否含有一些水果。

好的,让我们看看我的php代码:

$pattern='<apple|orange|pear|lemon|Goji berry>i';
$phrase="I will buy an apple to do an applepie!";

preg_match_all($pattern,$phrase,$match);

结果将是&#34; apple&#34;和&#34; applepie&#34;。

如何只搜索确切的事件? 阅读我发现的手册: http://php.net/manual/en/regexp.reference.anchors.php

我尝试使用\A\Z^$,但在我的情况下似乎没有人正常使用!

有人可以帮助我吗?

编辑:在@ cris85的回答之后,我试着改进我的问题...... 我的真实模式包含200多个occorrency,而且这个短语超过10000个caracters,所以真实案例太大而无法插入此处。

经过一些试验后,我发现了一个错误,就是这个问题&#34;微软交换&#34;!我必须逃脱一些特殊的角色吗? 目前我逃脱&#34; +&#34; &#34; - &#34; &#34;&#34; &#34;&#34; &#34; $&#34;和&#34; *&#34;。

1 个答案:

答案 0 :(得分:2)

您尝试使用的锚是完整字符串,而不是每个字。您可以使用word boundaries来匹配单个字词。这应该允许您只找到完整的水果匹配:

$pattern='<\b(?:apple|orange|pear|lemon|Goji berry)\b>i';

?:因此您不会创建其他捕获组,而是non-capture group

以下是正则表达式对边界匹配的定义:

  
      
  • 在字符串中的第一个字符之前,如果第一个字符是单词字符。
  •   
  • 在字符串中的最后一个字符之后,如果最后一个字符是单词字符。
  •   
  • 字符串中的两个字符之间,其中一个是单词字符,另一个不是单词字符。
  •   

PHP演示:https://3v4l.org/h5GCf

正则表达式演示:https://regex101.com/r/5aBaMO/1/