正则表达式用括号匹配单词边界字符串


Regex match word boundary string with parentheses

我正在尝试创建一个正则表达式来检查标签是否在文本中,但是有几个标签(来自数千个,不要问我为什么,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

主要问题是,它必须非常适合带括号和没有括号的标签,理想情况下易于编辑以支持标签中更多奇怪的字符([或>或以.或?或!结尾的标签(。

我现在真的很迷茫。如果您需要更多信息,只需发表评论,我会尝试添加它。

感谢您的帮助。

您可以使用

负的前瞻(?!'w)(表示下一个位置没有单词字符(。请注意,您不能使用 'b,因为'b不能在被视为非单词字符的)断言:

'btext '(jadad')(?!'w)

更新的正则表达式演示

我认为这就是你要找的:

'btext '(jadad')(?!'w)

演示

'b等价于(?<!'w)(?='w)|(?<='w)(?!'w):一个位置,后面跟着一个单词字符,前面没有一个字符(单词的开头(,或者前面有一个单词字符,后面不跟一个(单词的结尾(。 你有一个以非单词字符结尾的"单词",所以你必须删除该单词边界的(?<='w)部分。

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

我看不到正则表达式101,因为我在手机上,但这可能是您要找的?

 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