【问题标题】:Word with special characters match via preg_match in php带有特殊字符的单词通过 php 中的 preg_match 匹配
【发布时间】:2022-10-17 18:31:28
【问题描述】:
假设我有一个像这样的字符串:
$str ="Model number is FM223-56/89.";
我只想通过preg_match 匹配此字符串中的型号。
我这样做是这样的:
$model ="FM223-56/89.";
$pattern = '/\b'.$model.'\b/';
echo preg_match($pattern, $str);
但运气不好,我想搜索可以包含.-,'/" 的单词,是否可以通过preg_match 搜索?
没有固定的模式。
【问题讨论】:
-
尝试先引用字符串:'/\b'.preg_quote($model).'\b/'; - 这会转义任何在正则表达式中具有特殊含义的字符。但是,如果您只想检查一个字符串是否出现在另一个字符串中,则不需要正则表达式。在 PHP 8 中,您可以使用str_contains(),在 PHP 8 之前,您可以使用strstr()
-
标签:
php
regex
string
preg-match
special-characters
【解决方案1】:
两个问题:
- 信不信由你
.不是单词边界
- 您正在使用
/ 作为分隔符,但您的模式中有/
所以要么使用不同的分隔符:
$pattern = "~".$model."~";
或者更好的是,转义变量并指定您的分隔符:
$pattern = '/'.preg_quote($model, '/').'/';
【解决方案2】:
您需要adaptive dynamic word boundaries,即仅当相邻字符是单词字符时才应用单词边界:
$str ="Model number is FM223-56/89.";
$model ="FM223-56/89.";
$pattern = '/(?!Bw)' . preg_quote($model, '/') . '(?<!wB)/';
echo preg_match($pattern, $str); // => 1
请参阅PHP demo。
-
(?!Bw) - 检查下一个字符是否为单词字符,如果是,则在当前位置需要单词边界,否则不需要单词边界
-
(?<!wB) - 检查前一个字符是否为单词字符,如果是,则在当前位置需要单词边界,否则不需要单词边界。
注意preg_quote($model, '/') 部分:它转义了$model 字符串中的所有特殊字符以及用作正则表达式分隔符字符的/ 字符。