【问题标题】:Regexp for html [duplicate]html的正则表达式[重复]
【发布时间】:2011-04-05 23:16:04
【问题描述】:

可能重复:
RegEx match open tags except XHTML self-contained tags

我有以下字符串:

$str = " 
<li>r</li>  
<li>a</li>  
<li>n</li>  
<li>d</li>  
...
<li>om</li>  
";

如何获取前 n 个&lt;li&gt; 标签的 HTML?

Ex : n = 3 ; result = "<li>r<...>n</li>;

如果可能的话,我想要一个正则表达式。

【问题讨论】:

  • 所有你需要知道的都可以在这里找到:stackoverflow.com/questions/1732348/…
  • 为什么投反对票?大多数新手犯一次这个错误(希望只有一次)。此外,OP 并未解析整个文档,它看起来像是一串未嵌套的 &lt;li&gt;&lt;/li&gt; 标签。不是一个使用正则表达式的好地方,但它也没有那么不好。
  • prodigitalson - 实际上你给了我我所希望的最好的答案......我应该如何通过搜索找到它?
  • 这个问题已经被问过很多次了。人们不搜索吗?它在搜索中没有正确出现吗?到底是怎么回事?就在今天下午,它至少被问过几次!

标签: php html regex


【解决方案1】:

像这样。

$dom = new DOMDocument();
@$dom->loadHTML($str);
$x = new DOMXPath($dom); 

// we wan the 4th node.
foreach($x->query("//li[4]") as $node) 
{
  echo $node->c14n()
}

哦对了,学习xpath,以后省去很多麻烦。

【讨论】:

  • 我总是推荐 SimpleXML 而不是 DOMDocument,因为 DOMDocument 需要额外的对象(如 xpath)的重载,并使元素及其内容的选择变得复杂。
  • @Kau-Boy - 有趣,想发布一个例子吗?也确实意识到 DOMDocument 不需要你运行 html 虽然很整洁。这对我来说本身就是一个重大胜利。
【解决方案2】:

@Byron 的解决方案,但使用 SimpleXML:

$xml = simplexml_load_string($str);

foreach($xml->xpath("//li[4]") as $node){
  echo $node[0]; // The first element is the text node
}

编辑:我真正喜欢 simplexml 的另一个原因是节点内容的简单调试。您可以使用 print_r($xml) 打印带有子节点的对象。

【讨论】:

  • 已更正,感谢提示!
【解决方案3】:

我相信您知道使用正则表达式处理 HTML 不是一个好主意,除非您先“整理”它。

在 PHP 中一个非常可行的解决方案是使用简单 XML (http://php.net/manual/en/book.simplexml.php) 或作为 DOM 文档 (http://php.net/manual/en/class.domdocument.php) 导航 HTML 结构。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-23
    • 1970-01-01
    • 2014-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多