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