"反向"订购正则表达式 - 最接近"以上"比赛

时间:2015-04-15 11:16:30

标签: php regex

这是一些字符串的例子。

<div>other text</div> some text abc , <div>need_match_this</div> bbbb <p>hsa</p> aa <span>hello</span>

我只知道字符串"<span>hello</span>"的结尾,我需要匹配最近的&#34;上面的文字&#34;格。

我使用了这个正则表达式:

\<div\>(.*?)\<\/div\>.*?\<span\>hello\<\/span\>

但是这对我不起作用,因为我只需要返回最接近div的文本,而不是字符串中的第一个div。

是否有任何正则表达式解决方案可以解决此问题?

请帮忙。

谢谢

1 个答案:

答案 0 :(得分:5)

您需要使用基于正面的负面前瞻而不是中间.*?,因为.*?也会匹配打开或关闭div标记。

<div>((?:(?!<\/?div>).)*?)<\/div>(?:(?!<\/?div>).)*?<span>hello<\/span>

DEMO

(?:(?!<\/?div>).)*?强制正则表达式引擎匹配任何字符,但不匹配<div></div>。也就是说,在匹配每个字符之前,此正则表达式将检查该特定字符不是<div></div>中的起始字符。如果是,那么它将匹配该特定字符。如果不是,匹配将突然失败,并且以下字符不会匹配。

示例:

string - <div></div>

正则表达式 - <div>((?:(?!<\/?div>).)*?)<\/div>

对于此输入,上面提到的正则表达式将捕获中间的空字符串(,即开始和结束div标记之间存在空字符串)。上面的(?!<\/?div>).将检查以下char不能是<div></div>中的起始字符,但是这会失败,因为以下字符是<,这是一个凝视字符在</div>。因为我们将此特定正则表达式定义为重复零次或多次(?:(?!<\/?div>).)*?,所以它会捕获中间的空字符串。