【问题标题】:Regex match word boundary string with parentheses正则表达式匹配带括号的单词边界字符串
【发布时间】:2016-04-18 18:49:42
【问题描述】:

我正在尝试创建一个正则表达式来检查标签是否在文本中,但是有几个标签(来自数千个,不要问我为什么,SEO 专家告诉我的客户它很好)以括号结尾。

正则表达式对普通标签很有效,但在括号中普通失败,因为匹配必须是精确的,所以我不得不使用单词边界。有没有办法允许这样做?

这是我使用的原始正则表达式:

https://regex101.com/r/wN9jO8/1

这就是我尝试过的(是的,我不擅长正则表达式,但我尝试了谷歌搜索并没有发现任何真正有用的东西):

https://regex101.com/r/wN9jO8/2

我也尝试过修改单词边界,但没有正常工作(总是匹配标签前后的一个字符串)。

基本上,对于标签text (jadad)

lipsum is a dummy text (jadad) alsdasldk. // match
lipsum is a dummy text (jadad). // match
lipsum is a dummy text (jadad) // match
lipsum is a dummy (text (jadad)) // match

lipsum is a dummy text (jadad // should not match
lipsum is a dummy text jadad) // should not match
lipsum is a dummy text (jadad)asd // should not match

主要问题是,对于带括号和不带括号的标签,它必须完全正常工作,理想情况下可以轻松编辑以支持标签中更奇怪的字符([ 或 > 或以 . 或 ? 或 ! 结尾的标签)。

我现在真的迷路了。如果您需要更多信息,请发表评论,我会尝试添加。

感谢您的帮助。

【问题讨论】:

  • 什么是tag(jadad)是针吗?
  • @chris85 抱歉,我将其添加到问题中。它在 regex101 链接中,但我忘了在这里添加它。
  • 也许text \(jadad\)[^a-zA-Z]regex101.com/r/wN9jO8/4

标签: php regex


【解决方案1】:

您可以使用否定前瞻(?!\w)(表示下一个位置没有字符字符)。请注意,您不能使用\b,因为\b 不能在) 之后断言,这被认为是非单词字符:

\btext \(jadad\)(?!\w)

Updated Regex Demo

【讨论】:

  • 是的,但是不包含括号的标签(只是纯文本)将不起作用。
  • 看起来工作正常 :) 我会多玩一点,主要是明天我将在工作中处理代码时(因为我在业余时间玩它) .如果它会起作用(看起来会),我会接受你的回答。我应该更多地研究一下负前瞻和所有这些正则表达式魔法:P 谢谢你的帮助。
【解决方案2】:

我想这就是你要找的东西:

\btext \(jadad\)(?!\w)

DEMO

\b 等价于(?<!\w)(?=\w)|(?<=\w)(?!\w)后跟一个单词字符并且前面没有一个(单词的开头)的位置,或者之前的位置由一个单词字符而不是一个(单词结尾)。您有一个以非单词字符结尾的“单词”,因此您必须删除该单词边界的 (?<=\w) 部分。

根据您的需要,您可能希望将第一个 \b 更改为 (?<!\w)。另外,请注意\w 包含数字和下划线 (_);如果这不符合您的需要,您可以使用字符类,例如(?![A-Za-z0-9]).

【讨论】:

  • \)(?!\w)可以写成\)\B
  • @CasimiretHippolyte 不,它不能,因为它会忽略空格等。无论如何,这就是我需要的。我会给这个答案+1,但是正如anubhava之前发布的一样,我必须接受他的回答,对不起。
  • @MiChAeLoKGB:可以,它是同义词。
  • @CasimiretHippolyte:仅供参考,我的原始答案是\btext \(jadad\)\B,但后来我在OP 评论tag 并不总是以非单词字符结尾后将其更改为\btext \(jadad\)(?!\w)。所以标签可以是text (jadad),也可以是text
  • @CasimiretHippolyte 正如@anubhava 所说,它不必总是以括号结尾。我的问题中有它:The main problem is, it has to work perfectly fine for tags with parenthesis and without them, ideally easily editable to support more weird characters in tags ([ or > or tag ending with . or ? or !).
【解决方案3】:

我在手机上看不到 regex101,但这也许就是您要找的?

 preg_match_all("/(\(.*\))/", $input_lines, $output_array);

http://www.phpliveregex.com/p/fo9

编辑:

试试这个http://www.phpliveregex.com/p/fob

编辑2

http://www.phpliveregex.com/p/foc

编辑3
带文字(jadad)标签:

preg_match("/.*text (\(jadad\))[^\w].*/", $input_line, $output_array);

http://www.phpliveregex.com/p/fod

【讨论】:

  • 不,还差得远。该标签类似于text (another_text),因此它不仅在括号之间,它还必须匹配带有括号的文本(嗯,text (text) text 没问题,但text (text) 是)并且还要考虑单词边界。
  • 仍然不行,我必须准确指定标签,它不仅仅是任何字符,而是必须与单词边界匹配的确切文本。这就是我来这里的原因,因为我不知道如何进行这项工作。
  • 您的答案应该在这里,而不是在其他网站上。补充链接很好,但数据应该在这里,以防其他网站消失。
猜你喜欢
  • 1970-01-01
  • 2022-07-06
  • 1970-01-01
  • 1970-01-01
  • 2012-04-29
  • 2016-02-19
  • 2019-05-17
  • 2012-08-02
  • 2019-04-04
相关资源
最近更新 更多