Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex和PHP用于提取带有多个换行符的标记之间的内容_Php_Regex_Line Breaks - Fatal编程技术网

Regex和PHP用于提取带有多个换行符的标记之间的内容

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

如何提取具有多个换行符的标记之间的内容

我是regex的新手,他想知道如何处理未知数量的换行符以匹配我的查询

任务:提取
和第一个结束标记之间的内容。

原始来源:

<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版本不同,它也非常可读。