【发布时间】:2017-02-28 18:10:57
【问题描述】:
正则表达式
preg_match_all('@(\b' . preg_quote($needle,'@') . '\b)@is', $haystack, $matches);
干草堆
(Job: NAS-Inkrementell) Operation succeeded.
针
Operation succeeded --> 有效
Operation succeeded. --> 不工作
我做了一些测试:
替代干草堆
(Job: NAS-Inkrementell) Op.eration succeeded.
替代针
Op.eration succeeded --> 有效
所以,针确实被正确地逃脱了,正如我在dump(preg_quote($needle,'@')); 看到的那样 --> Operation succeeded\.
包含尾随点的正确方法是什么?
快速参考:http://www.phpliveregex.com/p/hzl
谢谢
编辑
当针是My-NAS时,我还需要区分大海捞针中的My-NAS和My-NAS-2,所以我还需要尾随\b。
EDIT2
ideone.com/Suzz2E 我希望它是 1 1 0 1 而不是 1 1 1 1,所以如果大海捞针中只有 MyNAS-2,则不应找到 MyNAS。
【问题讨论】:
-
因为字边界。要么删除结尾的
\b,要么替换为(?!\S)或(?!\w)(这取决于你认为是什么“单词”) -
查看我的编辑,在这种情况下
(?!\w)也不起作用... -
我还需要结尾的
\b- 如果您想匹配以.结尾的单词,则不需要。使用preg_match_all('@(?<!\w)' . preg_quote($needle,'@') . '(?!\w)@is', $haystack, $matches);去除与上下文相关的单词边界。 -
我现在无法测试它,但我希望如果 needle 是
MyNAS并且大海捞针包含MyNAS2它不匹配?它适用于尾随的.。 -
MyNAS-2在(Job: NAS-Inkrementell) MyNAS-2.中找到,因为M前面没有字符字符(=字母/数字/下划线),而2后面没有字符字符。 你认为一个词是什么?空格/开始/结束字符串之间的任何内容?然后使用(?<!\S)和(?!\S)而不是(?<!\w)/(?!\w)
标签: php regex preg-match-all preg-quote