如何匹配“<! - ”和“| - >”之间的内容?

时间:2013-01-05 22:54:08

标签: regex

<!--dle_image_begin:http://some_url.com/uploads/posts/2012-12/1.png|-->
<img src="some_url.com/uploads/posts/2012-12/1.png" alt="***" title="***"  />
<!--dle_image_end--> bla bla bla bla <!--dle_image_begin:http://some_url.com/uploads/posts/2012-12/2.png|-->
<img src="some_url.com/uploads/posts/2012-12/2.png" alt="***" title="***"  />
<!--dle_image_end--> bla bla bla <!--dle_image_begin:http://some_url.com/uploads/posts/2012-12/3.png|-->
<img src="some_url.com/uploads/posts/2012-12/3.png" alt="***" title="***"  />
<!--dle_image_end-->

从上面的示例我需要获得^<!--dle_image_begin:(.*)|-->$,但它返回所有字符串。

2 个答案:

答案 0 :(得分:1)

.也匹配|。所以正则表达式会到最后位置找|-->,这叫做贪婪。这是一个非常常见的错误,经常在这里询问。

解决这个问题的简单方法:

^<!--dle_image_begin:([^|]*)\|-->
                      ^^^^  ^    ^
                        |   |    |
           negative class   |    |
                  escape pipe    |
                    dollar is gone

否定字符类:除|以外的所有字符都匹配。因此,首先会找到|-->。正则表达式是它自己的语言,你需要在PHP旁学习。它遵循自己的规则。实践是完美的。

答案 1 :(得分:0)

这将匹配您想要的路径

(?<=<!--dle_image_begin:)((?:(?!\|-->).)*)(?=|-->)

第一个和最后一个部分((?<=<!--dle_image_begin:)&amp; (?=|-->))被称为“lookarounds”以检查字符串之前/之后。

有关详细说明,请参阅此处:http://www.regex101.com/r/iS8lE5