我正在尝试创建一个正则表达式来检查标签是否在文本中,但是有几个标签(来自成千上万,不要问我为什么,SEO专家告诉我的客户好了)哪个以括号结束。< / p>
正则表达式适用于普通标签,但是括号上的普通失败,因为匹配必须精确,所以我不得不使用单词边界。有没有办法允许这个?
这是我使用的原始正则表达式:
https://regex101.com/r/wN9jO8/1
这就是我尝试过的(是的,我对正则表达式并不好,但我尝试使用Google搜索并且冷却找不到任何真正有用的东西):
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
主要问题是,它必须对带有括号的标签完全正常,没有它们,理想情况下可以轻松编辑以支持标签中更多奇怪的字符([或&gt;或以。或?或!结尾的标签。)
我现在真的迷失了。如果您需要更多信息,请发表评论,我会尝试将其添加进去。
感谢您的帮助。
答案 0 :(得分:4)
您可以使用否定前瞻(?!\w)
(表示下一个位置没有单词char)。请注意,您无法使用\b
,因为\b
无法在被视为非单词字符的)
之后断言:
\btext \(jadad\)(?!\w)
答案 1 :(得分:3)
我认为这是你正在寻找的东西:
\btext \(jadad\)(?!\w)
\b
相当于(?<!\w)(?=\w)|(?<=\w)(?!\w)
:跟随一个字符的位置,而不是一个(字的开头),或之前的位置由单词字符而不是后跟单词(单词结尾)。你有一个&#34;字&#34;以非单词字符结尾,因此您必须删除该单词边界的(?<=\w)
部分。
根据您的需要,您可能希望将第一个\b
更改为(?<!\w)
。另请注意,\w
包含数字和下划线(_
);如果这不适合您的需求,您可以使用字符类,例如(?![A-Za-z0-9])
。
答案 2 :(得分:0)
我无法看到regex101,因为我在手机上,但这可能就是您要找的?
preg_match_all("/(\(.*\))/", $input_lines, $output_array);
http://www.phpliveregex.com/p/fo9
编辑:
试试这个http://www.phpliveregex.com/p/fob
EDIT2
http://www.phpliveregex.com/p/foc
EDIT3
使用text(jadad)标记:
preg_match("/.*text (\(jadad\))[^\w].*/", $input_line, $output_array);