Php Preg_match_all-在</h2>;标签

Php Preg_match_all-在</h2>;标签,php,regex,preg-match-all,Php,Regex,Preg Match All,在变量$url中,包含网站的内容 在下面的div中包含了页面的所有主要内容 <div id="mw-content-text" lang="pt" dir="ltr" class="mw-content-ltr"> 我想找到带有“历史记录”的 História[|] 正如上面可以看到的那样,在开始和结束之间有很多代码 但是我只需要在包含“História的标记之后获取前两段” preg_match_all('/(.+)/s',$url,$content); 如何将必须有“H

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

在下面的div中包含了页面的所有主要内容

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

我想找到带有“历史记录”的

História[|]
正如上面可以看到的那样,在开始
和结束
之间有很多代码

但是我只需要在包含“História
标记之后获取前两段

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

如何将必须有“História”的正则表达式放入,以及如何仅过滤
标记后的前两段?

您甚至不应该尝试使用正则表达式进行过滤。您正在解析HTML文档,正确的工具是DOM解析器。PHP有
DOMDocument
DOMXPath
类可供使用,因此不要三思:

$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);
$document=新的DOMDocument();
$document->loadHTML(mb_convert_编码($html,'html-ENTITIES','UTF-8');
$domxpath=新的domxpath($document);
$parages=$domxpath->query('
//氢[*[
包含(text(),“História”)
]
]
/以下兄弟姐妹::p[
位置()<3
]
');
var_dump($段);


$段落中有以下两个同级段落
。您需要对它们进行迭代以执行任何您想要的操作。

这称为解析。不要使用正则表达式解析HTML文档。使用DOM解析器。搜索:
DOMDocument
非常感谢您指示我正在阅读PHP手册()。我找到了。但是如何将变量转换为
XML
?我今天回答了这个问题:另外,您可以使用
[包含(,“História”)]
简化
[*[包含(,“História”)]
是的,但我更愿意保持这种方式。因为我没有对代码进行注释,所以我认为它更具可读性。谢谢,这非常有效。在某些段落中,有时会出现链接引用的
[1]
[2]
[3]
等,如何将其从段落中删除?@Gislef当您询问有关StackOverflow的问题时,非常重要的是提供一个真实的示例字符串以及您的问题中确切的预期结果。这样志愿者就可以只回答你的问题一次,而不会有后续问题的风险。
preg_match_all('/<h2>(.+)</h2>/s', $url, $content);
$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);