【问题标题】:PHP preg_match_all with Multiple WordsPHP preg_match_all 与多个单词
【发布时间】:2014-06-11 04:39:44
【问题描述】:

我正在尝试为几个单词的所有模式匹配测试一个字符串,这些单词是单词的开头。如果不是所有模式都匹配,我想将查询视为 False。单词测试的开始是有效的,但是我得到了重复的匹配项,我认为这让我感到惊讶,一旦找到一个单词的匹配项,它就不会再测试那个单词了。也许我需要以某种方式将测试限制为一场比赛。

我想象如果我测试 3 个单词,那么成功的测试将返回 3。

从示例中可以看出,返回值具有误导性。我得到一个正值,它大于我正在测试的单词数。在不匹配组的情况下,由于某些单词的多次匹配,我仍然得到一个高于要测试的单词数的值。

我想我还没有完全理解某些东西,或者我需要强制一个 AND 情况。

我已经用谷歌搜索了答案,但似乎没有一个是针对我的问题的。

$image = 'After A!!BC DEF hello bugggy bad Sled bob bobert robob Triumph 2000 Roadster clearing bobby Sledmere ^ August 2014 ^ error';

$result = preg_match_all($query, $image, $matches);

$query = '#\b(bob|bug|sled)#i';  // ALL MATCH
Return Value 6 [ bob x 3, bug x 1, sled x 1]

$query = '#\b(bob|bug|led)#i'; // Two matches 'led' fails
Return Value 4 [ bob x 3, bug x 1, led x 0]

【问题讨论】:

  • 如果我理解得很好,您想检查所有单词是否只出现一次?
  • 不,我想知道模式中的所有单词至少匹配一次。

标签: php regex preg-match-all


【解决方案1】:

您可以使用多个前瞻:

$text = 'After A!!BC DEF hello bugggy bad Sled bob bobert robob Triumph 2000 Roadster clearing bobby Sledmere ^ August 2014 ^ error';   
$pattern = '~^(?=.*\bbob)(?=.*\bbug)(?=.*\bsled)~i';   
if (preg_match($pattern, $text)) echo 'OK!';

【讨论】:

  • 在我的测试中返回 0。
  • 对不起,我错过了。我现在得到了 1 的回报,这也许就是我想要的。我会做进一步的测试并回来。
  • 看起来不错。如果我不能在一夜之间出错,我会在明天将其标记为答案。
  • 我不能错误的回答,所以会标记为正确 - 非常感谢。 @CD001 - 感谢您指出 preg_match_all 是错误的方法。
【解决方案2】:

试试这个

$image = 'After A!!BC DEF hello bugggy bad Sled bob bobert robob Triumph 2000 Roadster clearing bobby Sledmere ^ August 2014 ^ error';

$query = '#\b(bob|bug|sled)(.*?) #i';  // ALL MATC

preg_match_all($query, $image, $matches);

print_r($matches[0]);

【讨论】:

  • 据我了解,字符串必须在任何单词的开头包含“bob”、“bug”和“sled” - 全部,否则返回 false -如果这些术语中的 any 出现在任何单词的开头,则这将评估为 true;而不是在某个地方要求所有这些。
  • 一个有趣的结果。 'bob' 匹配一次,'sled' 匹配一次,但 'bug' 不匹配。添加空白字符有什么作用?
  • 抱歉又回到了原来的情况,给定值为6. bobx3, sledx2, bugx1
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-28
  • 1970-01-01
  • 1970-01-01
  • 2015-06-24
  • 1970-01-01
相关资源
最近更新 更多