【问题标题】:php - regex to match div tagsphp - 匹配 div 标签的正则表达式
【发布时间】:2014-04-14 16:12:14
【问题描述】:

我正在使用正则表达式来匹配页面中的特定 div,并将它们替换为自定义格式的。我不能使用 domdocument,因为我们处理的页面经常格式错误,并且在通过 domdocument 运行之后,页面被重新格式化并且显示不一样。

我目前正在使用以下完美的作品:

preg_match('#(\<div id=[\'|"]'.$key.'[\'|"](.*?)\>)(.*?)\<\/div\>#s', $contents, $response);

要匹配div标签如:

<div id="test"></div>
<div id="test" style="width: 300px; height: 200px;"></div>
etc...

我遇到的问题是id在样式或类之后的标签,例如:

<div class="test" id="test"></div>

如果我运行以下命令,正则表达式似乎变得贪婪并匹配 div 标签之前的大量 html,所以我不知道如何解决这个问题:

preg_match('#(\<div(.*?)id=[\'|"]'.$key.'[\'|"](.*?)\>)(.*?)\<\/div\>#s', $contents, $response);

有人有什么想法吗?

【问题讨论】:

标签: php regex html-parsing


【解决方案1】:

您可以使用 Ungreedy 修饰符 (U),并且 - 不要使用 .*,而是使用 [^&gt;]*(这意味着任何不是 > 因为 > 是标签的结尾,并且您正在搜索 withing标签)。当这不是您的分隔符时,您不需要转义 /(您使用 # 作为分隔符)

preg_match('#(<div[^>]*id=[\'|"]'.$key.'[\'|"][^>]*>)(.*)</div>#isU', $contents, $response);

【讨论】:

  • +1 [^&gt;]* 在正则表达式解析 HTML 时非常有价值。
【解决方案2】:

不要使用正则表达式进行 HTML 解析,那里有 DOM 解析器,例如 PHP DOM:http://www.php.net/manual/en/book.dom.php

【讨论】:

  • 对,但是要使用它们,你需要一个有效的 dom,这可能意味着首先要整洁,然后再实现 dom 对象,这可能会产生很多开销。有时,尤其是当您在寻找特定的信息时,如果您可以用两行代码编写一个简单的正则表达式,那么通过整个 Dom 解析程序是没有意义的。
  • 没有必要害怕这些东西。这只是一把电锯。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多