Regex和PHP用于提取带有多个换行符的标记之间的内容
如何提取具有多个换行符的标记之间的内容 我是regex的新手,他想知道如何处理未知数量的换行符以匹配我的查询 任务:提取Regex和PHP用于提取带有多个换行符的标记之间的内容,php,regex,line-breaks,Php,Regex,Line Breaks,如何提取具有多个换行符的标记之间的内容 我是regex的新手,他想知道如何处理未知数量的换行符以匹配我的查询 任务:提取和第一个结束标记之间的内容。 原始来源: <div class="test">optional text<br/> content<br/> <br/> content<br/> ... content<br/><a href="/url/">Hyperlink</a></di
和第一个结束标记之间的内容。
原始来源:
<div class="test">optional text<br/>
content<br/>
<br/>
content<br/>
...
content<br/><a href="/url/">Hyperlink</a></div></div></div>
可选文本
内容
内容
...
内容
我算出了下面的正则表达式
/<div class=\"test\">(.*?)<br\/>(.*?)<\/div>/
/(.*)(.*)/
只是想知道如何使用正则表达式匹配多个换行符
我们有DOM,但我不熟悉它。你不应该用正则表达式解析(x)html。使用DOM
我是xpath的初学者,但像这样的方法应该可以:
//div[@class='test']
这将选择类为“test”的所有div。您需要将html加载到DOMDocument对象中,然后创建一个与之相关的DOMDxpath对象,并调用其execute()
方法来获得结果。它将返回一个域节点列表对象。最终代码如下所示:
$domd = new DOMDocument();
$domd->loadHTML($your_html_code);
$domx = new DOMXPath($domd);
$items = $domx->execute("//div[@class='test']");
在此之后,您的div位于$items->item(0)
中
这是未经测试的代码,但如果我没记错的话,它应该可以工作
更新,忘记需要内容
如果需要文本内容(无标记),只需调用$items->item(0)->textContent
。如果您还需要这些标记,下面是javascript的innerHTML for PHP DOM的等价物:
function innerHTML($node){
$doc = new DOMDocument();
foreach ($node->childNodes as $child)
$doc->appendChild($doc->importNode($child, true));
return $doc->saveHTML();
}
使用
$items->item(0)
作为参数调用它。您可以使用preg\u match\u all('/(.**?)/si',$html,$matches)代码>。但是请记住,这将匹配HTML中的第一个结束符
。例如,如果HTML看起来像…aaa…bbb…ccc…
,那么您将得到…aaa…bbb…
作为$matches的结果
因此,最终使用DOM解析器确实是一个更好的解决方案。使用HTML解析器。在SO中,您可以找到大量使用DOM扩展的示例。您的意思是使用正则表达式解析XML?解析是将文本处理成有用数据的任务。Regexen只能够解析,例如,它不包括平衡括号的语言(其中([])()
匹配,但([)
不匹配)。HTML需要这样做的能力(例如,
是合法的,但
不是),因此不能用正则表达式解析。您有一个目标:“获取给定的div
”。但是,您所说的方法不可能达到目的。我承认在使用正则表达式处理变量和条件方面存在一些习惯。我将尝试使用本机方法-DOM来处理HTML/XML。稍后我将认真研究您的方法。目前正在阅读一些DOM教程。@John XPath需要一些习惯,但是当你开始看到它的强大功能时,你会发现它非常棒,而且比regexps有用得多。我最近开始将我的一个data miner类从regexps重写为dom和xpath,我很惊讶它变短了,而且与regex版本不同,它也非常可读。