如何正则表达式匹配不同结尾的文本?

时间:2010-04-02 10:07:38

标签: php html regex

这就是我现在所拥有的。

<h2>Information</h2>\n  +<p>(.*)<br />|</p>
                  ^ that is a tab space, didn't know if there was
 a better way to represent one or more (it seems to work)

我试图匹配'bla bla'。文本,但我当前的正则表达式不太有效,它将匹配大部分行,但我希望它匹配第一个

<h2>Information</h2>
    <p>bla bla.<br /><br /><a href="http://www.google.com">google</a><br />

<h2>Information</h2>
    <p>bla bla.</p> other code...

哦,我的PHP代码:

    preg_match('#h2>Information</h2>\n  +<p>(.*)<br />|</p>#', $result, $postMessage);                          

4 个答案:

答案 0 :(得分:6)

不要使用正则表达式来解析HTML。 PHP提供了可用于此目的的DOMDocument

说你的正则表达式有一些错误:

  • 您需要围绕轮换进行括号。
  • 你需要懒惰的修饰符。
  • 您无法输入“标题”以匹配“信息”。

通过这些更改,它看起来像这样:

<h2>.*?</h2>\n\t+<p>.*?(<br />|</p>)

你的正则表达也非常脆弱。例如,如果输入包含空格而不是制表符,或者行结尾是Windows样式,则正则表达式将失败。使用适当的HTML解析器将提供更强大的解决方案。

答案 1 :(得分:2)

使用\s匹配任何空白字符(包括空格,制表符,换行符等),例如

preg_match('#<h2>header</h2>\s*<p>(.*)<br />|</p>#', $result, $postMessage);  

但是,如前所述,不要使用正则表达式来解析HTML。

答案 2 :(得分:1)

<*>。*匹配应该是非贪心的(匹配最小的任意字符而不是maxium),即(。*?)我想在PHP中。

答案 3 :(得分:1)

尝试使用non-greedy取代(.*?)

来制作匹配(.*)