Php 将单一发生率检查为预匹配的模式

Php 将单一发生率检查为预匹配的模式,php,regex,preg-match-all,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); $pattern= 我试着使用\A,\

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

好的,让我们看看我的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);
$pattern=

我试着使用
\A
\Z
^
$
但是在我的情况下似乎没有人能正常工作

有人能帮我吗

编辑:在@cris85的回答之后,我试图改进我的问题。。。 我的really pattern包含200多个occorrency,短语超过10000个字符,因此实际大小写太大,无法在此处插入

经过一些测试,我发现了一个错误的发生“微软交易所”!有一些特殊的角色我必须逃脱?
此时,我转义“+”“-”.“$”和“*”

您尝试使用的锚点用于整个字符串,而不是每个单词。您可以使用来匹配单个单词。这将允许您仅查找完整的水果匹配:

$pattern='<\b(?:apple|orange|pear|lemon|Goji berry)\b>i';
$pattern='i';
?:
是这样的,所以您不需要创建额外的捕获组,它是一个
非捕获组

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

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


正则表达式演示:

Goji berry
非常昂贵。但是
preg\u match\u all
查找所有匹配项。为什么不使用
preg\u match
?你需要使用单词边界
\b
,把它们放在每个单词的周围,或者把你的替代词放在一个组中,然后把
\b
放在这个组的周围。@Casimir et Hippolyte:真的吗?诚然,我不知道它是什么:-)我插入了那个水果,因为维基百科是第一个由两个单词组成的水果:-D@u_mulder:我不太清楚preg libs,但你是对的!有一只小虫子。。它没有找到最后的水果:“枸杞”!你能把你的绳子寄出去吗?@cris85:昨天我看到“Microsoft exchange”中出现了错误,今天经过一些测试,我发现问题不在“两个字”上,而是在这个特定的案例中!我修改了我的问题,但是,也许,我应该创建一个新的问题。。。但是我接受你的回答!非常感谢你!所以,
$pattern
是动态的,而不是静态的<代码>Microsoft exchange
没有任何特殊字符。如果你有一些其他的词打破了这个表达,你可以使用
preg_quote
。是的,这个短语是dinamic!我如何发现此示例无法正常工作: