【问题标题】:replace img src with php用 php 替换 img src
【发布时间】:2015-02-24 16:47:37
【问题描述】:

我想获取一个存储在变量中的代码块并替换其中任何图像标签的 src 而不会干扰代码块的其余部分。

例如:代码块可能是:

<a href="http://mylink.com"><img src="image1.jpg"></a>

我想将其更改为(使用 PHP):

<a href="http://mylink.com"><img src="altimage.jpg"></a>

我目前正在使用我发现的解决方案,该解决方案使用 PHP DOM 模块来更改图像标签,但该函数仅返回更改后的 img 标签 HTML,而不返回 HTML 的其余部分。

我调用的函数如下:

function replace_img_src($original_img_tag, $new_src_url) {
    $doc = new DOMDocument();
    $doc->loadHTML($original_img_tag);
$tags = $doc->getElementsByTagName('img');
if(count($tags) > 0)
{
       $tag = $tags->item(0);
       $tag->setAttribute('src', $new_src_url);
       return $doc->saveXML($tag);
}

return false;
}

当然,这只是返回更改后的 img 标记,但会去除其他 HTML(例如 A 标记)——我将整个代码块传递给函数。 (顺便说一句 - 对我来说,没有图像标签的错误返回也很好)。

请问我在这里错过了什么?

非常感谢您的任何帮助。

【问题讨论】:

  • return $doc-&gt;saveHTML(); 有什么问题吗?
  • 看看preg_replace函数。
  • Niet the Dark Absol - 有效(非常感谢),但它在代码中添加了一个 doctype 和一个 html 标签和一个 body 标签 - 有没有办法解决这个问题?顺便说一句 - 这是我第一次使用 DOM 模块,你可能会说 lol

标签: php dom replace tags


【解决方案1】:

您需要使用return $doc-&gt;saveXML(); 而不是return $doc-&gt;saveXML($tag);。见saveXML的documentation

saveXML ([ DOMNode $node [, int $options ]] )

node:使用此参数只输出一个特定节点,没有XML声明而不是整个文档

【讨论】:

  • ByteHamster 确实有效,但它在代码周围放置了一个 HTML 包装器(和文档类型)。我刚刚阅读了另一篇 SO 帖子,其中解释了包装器实际上是在 LOAD 时添加的,但可以在 loadHTML 中使用 LIBXML_HTML_NOIMPLIED | 禁用。 LIBXML_HTML_NODEFDTD 参数,但这仅在 PHP 5.4 中实现,我目前坚持使用 5.3.x。一种解决方法是使用 loadXML,然后使用 saveHTML,但这并不理想。帖子在这里供参考:stackoverflow.com/questions/4879946/…
  • 使用saveXML 并在之后剥离第一行怎么样?
  • 真棒 :) loadXML 和 saveXML 并剥离第一行完美 - 谢谢!
  • 实际上 - 这是有问题的。如果字符串不包含 HTML(即:类似“hello there”),则 loadXML 不喜欢它。事实上,无论我使用 loadHTML 还是 loadXML,count($tags) 始终为 1 生成的字符串“hello there”:$tags = $doc->getElementsByTagName('img');
  • 好的 - 通过使用 $tags->length 而不是 count($tags) 解决了这个问题,哈哈
猜你喜欢
  • 2016-06-03
  • 1970-01-01
  • 2019-04-27
  • 1970-01-01
  • 1970-01-01
  • 2012-11-26
  • 2016-03-09
  • 2017-01-10
  • 2014-05-07
相关资源
最近更新 更多