正则表达式:在换行符之前匹配所有html标签

时间:2011-11-11 12:37:42

标签: php html regex

我把头发拉过这一头。我想获得< a>中的所有内容标签,我的html结构看起来像:

<ul>
  <li><a href="#">One</a></li>
  <li><a href="#">Two</a></li>
  <li><a href="#">Three</a></li>
</ul>

我的正则表达式:

/<a ?.*>(.*?)<\/a>/

当cms没有输出带有换行符的&lt; li&gt;时出现问题:

<ul>
  <li><a href="#">One</a></li><li><a href="#">Two</a></li>
  <li><a href="#">Three</a></li>
</ul>

这是匹配数组的一些示例输出:

Array
(
    [0] => Array
        (
            [0] => <a href="/schools/early-years-groups" class="active">Early Years Groups</a></li><li class="leaf first menu-mlid-20328 order_early_years_stuff"><a href="#" title="Order Schools Stuff">Order Early Years Stuff</a>
            [1] => <a href="/schools/early-years-groups/fundraise" title="Fundraise">Fundraise</a>
            [2] => <a href="/schools/early-years-groups/ey-showcase" title="Early Years Showcase">Early Years Showcase</a>
            [3] => <a href="/schools/how-to-pay-your-money-in" title="">How To Pay Your Money In</a>
            [4] => <a href="/schools/early-years-groups/learning-activities" title="Learning Activities">Learning Activities</a>
        )

    [1] => Array
        (
            [0] => Order Early Years Stuff
            [1] => Fundraise
            [2] => Early Years Showcase
            [3] => How To Pay Your Money In
            [4] => Learning Activities
        )

)

非常感谢任何帮助,这让我疯了!

3 个答案:

答案 0 :(得分:2)

你不应该使用正则表达式解析HTML ...你会发现很多例子在这里解释原因。

也许像PHP Simple DOM Parser这样的东西可以帮到你。

答案 1 :(得分:2)

问题是,当>应该是懒惰的时候,你会使用贪婪的搜索。这是一个例子:

<a .*?>(.*?)<\/a>
     ^

在此处查看此行动:http://regexr.com?2v60h

答案 2 :(得分:1)

你的正则表达式在开头标签上过于“贪婪”。这样的事情会更好:

<a\s?[^>]*>([^<]*)</a>

它匹配锚点,带有可选空格,后跟任何内容但关闭&gt;标签,所以当它击中&gt;时它肯定会停止。同样的技巧适用于锚点的内容,寻找任何东西但是&lt;结束锚标记。