【问题标题】:Regex - Escaping square brackets along with boundry正则表达式 - 与边界一起转义方括号
【发布时间】:2020-04-16 00:29:46
【问题描述】:

我有一个网站,当在句子中检测到关键字时,用户可以进行自定义操作。我目前的比赛方式如下:

$output = array();
preg_match('/\b' . $keyword . '\b/', $phrase, $output);

如果我找到匹配 if(count($output) > 0) { 则运行自定义操作。这适用于口语句子,因此适用于操作员之类的东西,我们有一个名为 [silence] 的自定义,因此当检测到静音时,它会运行一个动作。

但是,当关键字包含方括号时,例如:[silence] 正则表达式失败,因为它有方括号。我试过像\b\[silence\]\b 一样转义,但是这并没有检测到匹配。

这也是在 PHP 中

提前致谢, 乔

【问题讨论】:

    标签: php regex


    【解决方案1】:

    如果下一个字符是单词的一部分,则“单词边界”表达式匹配,而 [ 不是(它不是字母)

    来自Regex tutorial

    有资格作为单词边界的三个不同位置:

    • 在字符串的第一个字符之前,如果第一个字符是单词字符。
    • 在字符串的最后一个字符之后,如果最后一个字符是单词字符。
    • 字符串中两个字符之间,一个是单词字符,另一个不是单词字符。

    简单地说:\b 允许您使用 \bword\b 形式的正则表达式执行“仅整个单词”搜索。 “单词字符”是可用于构成单词的字符。所有不是“单词字符”的字符都是“非单词字符”。

    因此您需要“重写”\b 表达式以满足您的需要,例如:

    (?<=[\s\.,;])\[silence\](?=[\s\.,;])
    

    首先,一个不匹配的“分隔符”(空格、点、逗号……您可能还需要添加一些),然后是您的表达式,然后是一个不匹配的分隔符。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-20
      • 1970-01-01
      相关资源
      最近更新 更多