【问题标题】:Regex PHP: find text after certain tag [closed]正则表达式 PHP:在特定标记后查找文本 [关闭]
【发布时间】:2015-06-17 07:02:59
【问题描述】:

我在数据库中有这样的条目:

<div>
   <a href="path/img.jpg">
     <img src="path/img.jpg"/>
   </a> 
   Photograph: Name of Photographer
</div>

我想要达到的是,围绕图像描述制作一个 p-Tag

为了获取文本,我有这样的正则表达式:

$regex_pattern = "/.jpg\"\/><\/a>(.*)<\/div>/";
$replace = ".jpg\"/></a><p class=\"img-caption\">$1</p></div>/";
$content = preg_replace($regex_pattern, $replace, $content);

但我在图像描述后得到一个空的 p-tag。我做错了什么

【问题讨论】:

  • “一些错误”非常不具体。你得到了什么错误?错误信息?有什么事吗?
  • 我不能强调这一点,不要使用正则表达式进行 HTML 解析。请改用 DOMDocument。
  • 但是如何获取不在标签中的文本?如何使用 DOMDocument 获取图像描述并使用比正则表达式更少的步骤进行包装?

标签: php regex


【解决方案1】:

您没有包含可能的空格或换行符,请将您的模式更改为:

$regex_pattern = "/.jpg\"\/>\s*<\/a>\s*(.*)\s*<\/div>/";

在这里查看:

http://sandbox.onlinephpfunctions.com/code/d74f8c65c3cef80fe88721269e2c97004e0b9a68

【讨论】:

  • 感谢您的提议,但它仍然是相同的,图像描述后的空 p-tag
  • 它对我有用,看看沙箱,我包含了链接。
  • 多了一个空格:$regex_pattern = "/.jpg\"\s*\/>\s*\s*(.*)\s*/"; 谢谢!
【解决方案2】:

我不能强调这一点,不要使用正则表达式进行 HTML 解析。相反,使用DOMDocument 更容易、更安全。这只是实现目标的几种方法之一。这个想法是解析 HTML,找到最后一个文本节点,然后将其包装在 &lt;p&gt; 标签中。

$dom = new DOMDocument;

// Load the HTML without saving the wrapper info
$dom->loadHTML($html, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);
$xp = new DOMXPath($dom);
$textNodes = $xp->query('//div/text()');
$lastTextNode = $textNodes->item($textNodes->length - 1);

$element = $dom->createElement('p');
$element->nodeValue = $lastTextNode->nodeValue;
$lastTextNode->parentNode->replaceChild($element, $lastTextNode);

echo $dom->saveHTML();

输出:

<div>
   <a href="path/img.jpg">
     <img src="path/img.jpg">
   </a><p> 
   Photograph: Name of Photographer
</p></div>

演示: IDEOne


更多阅读:Wrap DOM element in another DOM element in PHP

【讨论】:

  • 感谢您的宝贵时间和解释!我也喜欢你的方式,可能没有正则表达式复杂,但是......你必须承认,它并不短。
  • 等到 HTML 变得更长、更复杂和/或格式错误... DOMDocument 可以处理所有这些情况。将这种方法藏在你的帽子下,以备将来的项目使用。 ;)
猜你喜欢
  • 2011-10-07
  • 1970-01-01
  • 1970-01-01
  • 2018-12-02
  • 2021-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多