0

我一定是过于复杂了,但我无法为我的生活弄明白。

我有一个存储为字符串的标准 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>

如何在两个单词之间进行搜索,只返回每个段落之间的结果?

4

3 回答 3

1

使用 DOM 或 XPATH 之类的 HTML 解析器来解析 HTML。不要使用正则表达式来解析 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";
}

代码在行动


使用这个正则表达式(正如你所说的正则表达式练习)你会得到 4 个结果。

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

这里使用了环视语法。请参阅实际代码

于 2013-01-01T06:13:34.440 回答
0

用于.*?获取最短匹配而不是最长匹配。

于 2013-01-01T04:51:09.947 回答
0

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

你不应该做一个小组:(<p>)

于 2013-01-01T05:59:57.883 回答