我有模式'šalotka 29%'
,我需要知道字符串是否'something something šalotka 29% something'
包含模式,但不知道模式是否是较长单词的一部分'something something šalotka 29%something'
我有这个mb_eregi('\b' . $pattern . '\b', $string)
,但它不起作用,因为正则表达式边界不适用于特殊字符。有什么建议吗?
单词边界仅在单词字符(来自\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 语法,请随意编写自己的。