【问题标题】:Regex match word boundary with quotes [duplicate]正则表达式用引号匹配单词边界[重复]
【发布时间】:2019-05-17 19:42:22
【问题描述】:

我正在尝试匹配单词边界内的字符串。

preg_match('/\bTORUK Cirque du Soleil\b/ims',
           'Show: TORUK Cirque du Soleil with Lady Gaga', $matches);

Output: TORUK Cirque du Soleil

这很完美。但是当字符串中有引号时,它不会按预期工作。例如,

preg_match('/\bTORUK "Cirque du Soleil"\b/ims',
           'Show: TORUK "Cirque du Soleil" with Lady Gaga', $matches);

它根本不匹配。在这种情况下,预期的输出是TORUK "Cirque du Soleil"

尝试使用\B 即非单词边界,但在没有引号的字符串中中断。

已创建fiddle here

【问题讨论】:

  • 引用手册:“单词边界是主题字符串中当前字符和前一个字符不匹配 \w 或 \W 的位置(即一个匹配 \w 和其他匹配 \W)” - 与 "[space] 你没有那个。
  • 是的,如果双引号单词边界不属于。这些类型的情况有什么解决方法吗?
  • 你为什么使用\b?这不是单词边界。
  • @user3783243 你用了两个(?<!\w)。一个应该是(?!\w)
  • @revo,感谢您提供的环视解决方案 :)

标签: php regex


【解决方案1】:

首先,正如@misorude 指出的那样,您需要指定适当的分隔符,例如/。其次,您可以指定匹配单词边界或引号 - 如下所示:

preg_match('/\bTORUK "?Cirque du Soleil("|\b)/',
           'Show: "TORUK Cirque du Soleil with Lady Gaga"', $matches);

请注意,这涉及您提供的具体示例,您可能需要相应地调整代码。

【讨论】:

  • 我的帖子中有一个示例链接,其中包含一组不同的示例。你能检查一下吗?
【解决方案2】:

您不需要(也不应该使用)\b
你有一个句子而不是一个词。

preg_match('/TORUK "Cirque du Soleil"/ims',
       'Show: TORUK "Cirque du Soleil" with Lady Gaga', $matches);
var_dump($matches);

输出:

array(1) {
  [0]=>
  string(24) "TORUK "Cirque du Soleil""
}

回答您的评论。
仅在第一个和最后一个单词上使用单词边界:

preg_match('/\bTORUK\b "Cirque du \bSoleil\b"/ims',
       'showTORUK "Cirque du Soleil" with Lady Gaga', $matches);
var_dump($matches);

https://3v4l.org/bIW4i

【讨论】:

  • 需要词边界以防止子字符串被匹配。例如。如果源字符串是ShowTORUK "Cirque du Soleil" with Lady Gaga,它不应该匹配。
  • @Samir 查看更新
  • 感谢您的更新。非常感谢所有的帮助。如果最后一个单词是子字符串,则匹配,例如 show: TORUK "Cirque du Soleil"with Lady Gaga
猜你喜欢
  • 2022-07-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多