0

我有模式'šalotka 29%' ,我需要知道字符串是否'something something šalotka 29% something'包含模式,但不知道模式是否是较长单词的一部分'something something šalotka 29%something'

我有这个mb_eregi('\b' . $pattern . '\b', $string) ,但它不起作用,因为正则表达式边界不适用于特殊字符。有什么建议吗?

4

1 回答 1

-1

单词边界仅在单词字符(来自\w字符类的字符)和非单词字符或字符串的限制之间匹配。

如果您搜索的字符串以非单词字符开头或结尾,则不能使用单词边界。

困难在于准确地定义自己将所需链与其他链区分开来。换句话说,这是你的选择。无论您的选择是什么,您都可以使用相同的技术:在字符串之前和之后使用环视来定义您不想要的字符串周围的内容:否定的lookbehind(?<!...)和否定的lookahead (?!...)

例子:

  • 禁止所有不是字符串周围的空格:
mb_eregi('(?<!\S)' . $item . '(?!\S)', $string, $match);
  • 禁止所有不是单词的字符:
mb_eregi('(?<!\w)' . $item . '(?!\w)', $string, $match);

完整示例:

$item = 'šalotka 29%';
$string = 'something something šalotk 29% something';

mb_regex_encoding('UTF-8'); // be sure to use the correct encoding

// if needed escape regex special characters
$item = mb_eregi_replace('[\[\](){}.\\\\|$^?+*#-]', '\\\0', $item);

mb_eregi('(?<!\S)' . $item . '(?!\S)', $string, $matches);

print_r($matches);

注意事项:

  • 如果ereg函数现在已过时并且已从最近的 PHP 版本中删除mb_ereg,则基于 oniguruma 正则表达式引擎的函数仍然存在并提供preg_函数 (PCRE) 中不可用的特性。

  • 显然,对于当前的问题,您可以使用以下方法执行相同的操作preg_match

preg_match('~(?<!\S)' . $item . '(?!\S)~ui', $string, $match);
  • 如果无法控制搜索到的字符串(例如用户输入),请注意该字符串不包含特殊的正则表达式字符。
    使用preg_函数可以preg_quote用来转义它们,但也可以“自己做”,$item = mb_ereg_replace('[\[\](){}.\\\\|$^?+*#-]', '\\\0', $item);这足以满足mb_ereg函数中大多数可用的语法(请注意,转义所有非单词字符也可以完成这项工作)。如果您想处理 Emacs 或 BRE 语法,请随意编写自己的。
于 2022-02-08T17:01:35.340 回答