繁体   English   中英

在php中,如何使用正则表达式捕获两个模式之间的所有内容(以及每个模式的最短实例)?

[英]In php, how can I use a regular expression to capture everything between two patterns (and the shortest instance of each pattern)?

我一定太复杂了,但是我无法终生解决。

我有一个存储为字符串的标准html文档,我需要获取该段落的内容。 我将举例说明。

$stringHTML=
"<html>

<head>
<title>Title</title>
</head>

<body>

<p>This is the first paragraph</p>
<p>This is the second</p>
<p>This is the third</p>
<p>And fourth</p>

</body>
</html>";

如果我用

$regex='~(<p>)(.*)(</p>)~i';
preg_match_all($regex, $stringHTML, $newVariable); 

我不会得到4个结果。 相反,我得到10,因此得到10,因为正则表达式与第一个<p>和第一个</p>以及第一个<p>和第四个</p>匹配

如何在两个单词之间搜索,并且仅返回每个段落之间的结果?

使用DOM或XPATH之类的HTML解析器来解析HTML。 不要使用Regex解析HTML 这是DOMDocument可以轻松解析的方法。

$doc = new \DOMDocument;
$doc->loadHTML($stringHTML);
$ps = $doc->getElementsByTagName("p");
for($i=0;$i<$ps->length; $i++){
    echo $ps->item($i)->textContent. "\n";
}

实际代码


使用此RegEx(正如您所说的regex实践 ),您将获得4个结果。

preg_match_all("#<p>(.*)</p>#", $stringHTML, $matches);
print_r($matches[1]);

这里使用环顾语法 参见实际代码

使用.*? 获得最短的比赛,而不是最长的比赛。

您的正则表达式应为/<p>(.*?)<\\/p>/i 它只会匹配<p></p>之间的字符串,并将其放入数组中。

您不应该分组: (<p>)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM