preg_quote 忽略 preg_match_all 中的尾随点
preg_quote ignores trailing dot in preg_match_all
正则表达式
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
模式需要在 .
之后有一个单词字符。您需要实施 自定义 字边界。
由于您需要匹配前面没有单词 char 或连字符并且后面没有单词 char 或连字符的字符串,您可以使用
preg_match_all('@(?<![\w-])' . preg_quote($needle1,'@') . '(?![\w-])@is', $haystack, $matches)
参见regex demo。
参见PHP demo:
$haystack1 = "(Job: NAS-Inkrementell) Operation succeeded. MyNAS-2 reports duty.";
$needle1 = "Operation succeeded";
echo preg_match_all('@(?<![\w-])' . preg_quote($needle1,'@') . '(?![\w-])@is', $haystack1, $matches1) ."\n";
$needle2 = "Operation succeeded.";
echo preg_match_all('@(?<![\w-])' . preg_quote($needle2,'@') . '(?![\w-])@is', $haystack1, $matches2) ."\n";
$needle3 = "MyNAS";
echo preg_match_all('@(?<![\w-])' . preg_quote($needle3,'@') . '(?![\w-])@is', $haystack1, $matches3) ."\n";
$needle4 = "MyNAS-2";
echo preg_match_all('@(?<![\w-])' . preg_quote($needle4,'@') . '(?![\w-])@is', $haystack1, $matches4) ."\n";
正则表达式
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
模式需要在 .
之后有一个单词字符。您需要实施 自定义 字边界。
由于您需要匹配前面没有单词 char 或连字符并且后面没有单词 char 或连字符的字符串,您可以使用
preg_match_all('@(?<![\w-])' . preg_quote($needle1,'@') . '(?![\w-])@is', $haystack, $matches)
参见regex demo。
参见PHP demo:
$haystack1 = "(Job: NAS-Inkrementell) Operation succeeded. MyNAS-2 reports duty.";
$needle1 = "Operation succeeded";
echo preg_match_all('@(?<![\w-])' . preg_quote($needle1,'@') . '(?![\w-])@is', $haystack1, $matches1) ."\n";
$needle2 = "Operation succeeded.";
echo preg_match_all('@(?<![\w-])' . preg_quote($needle2,'@') . '(?![\w-])@is', $haystack1, $matches2) ."\n";
$needle3 = "MyNAS";
echo preg_match_all('@(?<![\w-])' . preg_quote($needle3,'@') . '(?![\w-])@is', $haystack1, $matches3) ."\n";
$needle4 = "MyNAS-2";
echo preg_match_all('@(?<![\w-])' . preg_quote($needle4,'@') . '(?![\w-])@is', $haystack1, $matches4) ."\n";