【问题标题】:Preg_match_all - 2 first paragraphs after </h2> tagPreg_match_all - </h2> 标签后的 2 个第一段
【发布时间】:2018-03-03 20:36:41
【问题描述】:

在变量$url 中,包含网站的内容

下面的div里面有页面的所有主要内容

<div id="mw-content-text" lang="pt" dir="ltr" class="mw-content-ltr">

我想查找具有“História”的&lt;H2&gt;

<h2><span id="Hist.C3.B3ria"></span><span class="mw-headline" id="História">História</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Adamantina&amp;veaction=edit&amp;section=1" class="mw-editsection-visualeditor" title="Editar secção: História">editar</a><span class="mw-editsection-divider"> | </span><a href="/w/index.php?title=Adamantina&amp;action=edit&amp;section=1" title="Editar secção: História">editar código-fonte</a><span class="mw-editsection-bracket">]</span></span></h2>

在结束&lt;/h2&gt;的开始&lt;h2&gt;标签之间有很多代码,可以在上面看到

但我只需要在包含“História”的&lt;/h2&gt;标签之后获取前两段&lt;p&gt;

preg_match_all('/<h2>(.+)</h2>/s', $url, $content);

如何输入必须具有“História”的正则表达式,以及如何仅过滤&lt;/h2&gt; 标记后的前两段?

【问题讨论】:

标签: php regex preg-match-all


【解决方案1】:

您甚至不应该尝试使用正则表达式来做到这一点。您正在解析 HTML 文档,而正确的工具是 DOM 解析器。 PHP 有 DOMDocumentDOMXPath 类可以使用,所以不要三思而后行:

$document = new DOMDocument();
$document->loadHTML(mb_convert_encoding($html, 'HTML-ENTITIES', 'UTF-8'));
$domxpath = new DOMXPath($document);
$paragraphs = $domxpath->query('
    //h2[*[
            contains(text(), "História")
          ]
        ]
    /following-sibling::p[
            position() < 3
        ]
');
var_dump($paragraphs);

PHP live demo

$paragraphs 中有两个以下同级段落。你需要遍历它们来做任何你想做的事情。

【讨论】:

  • 另外,您可以将[*[contains(text(), "História")]] 简化为[contains(., "História")]
  • 是的,但我更愿意保持这种状态。由于我没有评论代码,我认为会更具可读性。
  • 谢谢,这很好用。在某些段落中有时会出现[1][2][3] 等的链接引用,如何从段落中删除?
  • @Gislef 当您在 StackOverflow 上提问时,提供一个真实的示例字符串以及您在问题中的确切预期结果非常重要。这样志愿者就可以只回答一次您的问题,而不会出现后续问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多