[英]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.