【问题标题】: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】:

两个问题:

  1. 信不信由你.不是单词边界
  2. 您正在使用/ 作为分隔符,但您的模式中有/

    所以要么使用不同的分隔符:

    $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) - 检查下一个字符是否为单词字符,如果是,则在当前位置需要单词边界,否则不需要单词边界
    • (?&lt;!wB) - 检查前一个字符是否为单词字符,如果是,则在当前位置需要单词边界,否则不需要单词边界。

    注意preg_quote($model, '/') 部分:它转义了$model 字符串中的所有特殊字符以及用作正则表达式分隔符字符的/ 字符。

    【讨论】:

      最近更新 更多