正则表达式和 PHP 用于提取具有多个换行符的标签之间的内容

发布于 2024-09-04 15:40:51 字数 611 浏览 10 评论 0原文

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

我是正则表达式的新手,想知道如何处理未知数量的换行符以匹配我的查询。

任务:提取

和第一个结束
标记之间的内容。

原始来源:

<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,但我对此并不熟悉。

How can I extract the content between tags with several line breaks?

I'm a newbie to regex, who would like to know how to handle unknown numbers of line break to match my query.

Task: Extract content between <div class="test"> and the first closing </div> tag.

Original source:

<div class="test">optional text<br/>
content<br/>
<br/>
content<br/>
...
content<br/><a href="/url/">Hyperlink</a></div></div></div>

I've worked out the below regex,

/<div class=\"test\">(.*?)<br\/>(.*?)<\/div>/

Just wonder how to match several line breaks using regex.

There is DOM for us but I am not familiar with that.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

夏末染殇 2024-09-11 15:40:51

您不应该使用正则表达式解析 (x)html。使用 DOM。

我是 xpath 的初学者,但是这样的应该可以工作:

//div[@class='test']

这会选择所有带有“test”类的 div。您需要将 html 加载到 DOMDocument 对象中,然后创建与之相关的 DOMXpath 对象,并调用其 execute() 方法来获取结果。它将返回一个 DOMNodeList 对象。
最终代码如下所示:

$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即可。如果您还需要这些标签,这里相当于 PHP DOM 的 javascript 的innerHTML:

function innerHTML($node){
  $doc = new DOMDocument();
  foreach ($node->childNodes as $child)
    $doc->appendChild($doc->importNode($child, true));

  return $doc->saveHTML();
}

使用 $items->item(0) 作为参数调用它。

You should not parse (x)html with regular expressions. Use DOM.

I'm a beginner in xpath, but one like this should work:

//div[@class='test']

This selects all divs with the class 'test'. You will need to load your html into a DOMDocument object, then create a DOMXpath object relating to that, and call its execute() method to get the results. It will return a DOMNodeList object.
Final code looks something like this:

$domd = new DOMDocument();
$domd->loadHTML($your_html_code);
$domx = new DOMXPath($domd);
$items = $domx->execute("//div[@class='test']");

After this, your div is in $items->item(0).

This is untested code, but if I remember correctly, it should work.

Update, forgot that you need the content.

If you need the text content (no tags), you can simply call $items->item(0)->textContent. If you also need the tags, here's the equivalent of javascript's innerHTML for PHP DOM:

function innerHTML($node){
  $doc = new DOMDocument();
  foreach ($node->childNodes as $child)
    $doc->appendChild($doc->importNode($child, true));

  return $doc->saveHTML();
}

Call it with $items->item(0) as the parameter.

可爱暴击 2024-09-11 15:40:51

您可以使用 preg_match_all('/

(.*?)<\/div>/si', $html, $matches);。但请记住,这将与 HTML 中第一个结束的

相匹配。 IE。如果 HTML 看起来像

...aaa...

...bbb...

...ccc...< /div> 那么你会得到 ...aaa...

...bbb... 作为 $matches... 的结果,

所以最后使用DOM 解析器确实是一个更好的解决方案。

You could use preg_match_all('/<div class="test">(.*?)<\/div>/si', $html, $matches);. But remember that this will match the first closing </div> within the HTML. Ie. if the HTML looks like <div class="test">...aaa...<div>...bbb...</div>...ccc...</div> then you would get ...aaa...<div>...bbb... as the result in $matches...

So in the end using a DOM parser would indeed by a better solution.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文