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

时间:2016-04-18 18:49:43

标签: php regex

我正在尝试创建一个正则表达式来检查标签是否在文本中,但是有几个标签(来自成千上万,不要问我为什么,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;或以。或?或!结尾的标签。)

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

感谢您的帮助。

3 个答案:

答案 0 :(得分:4)

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

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

Updated Regex Demo

答案 1 :(得分:3)

我认为这是你正在寻找的东西:

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

DEMO

\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);

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