使用preg_replace内部标记

时间:2014-03-10 12:12:15

标签: regex preg-replace

我想将所有url img src标记值从一个字符串更改为第二个字符串,如下所示:

   $str1 = "< img src="//d3kq20n0vvk93.cloudfiojiojront.net/cbbcadjiojoijc470efd702jijiojoijiojioc4.jpg" alt="">";

为:

  $str2 = "< img src="//d3kq20n0vvk93.cloudfiojiojront.net/cbbcadjiojoijc470efd702jijiojoijiojioc4.jpg?ttl=3600/" alt="">";

我试过这种方式,但它在src =“”tag:

中无效
   print preg_replace('/<img\s.*?\bsrc="(.*?)".*?>/si', "$0?ttl=3600", $str);

我该如何解决? 提前致谢

1 个答案:

答案 0 :(得分:0)

它无效,因为$0指的是整个匹配(从<img>,您将获得类似{{1}的内容}}

您需要的是只更改src内容,您可以:

  • 使用捕获组:

    <img...>?tll=3600

  • 使用\K (重置匹配开头的匹配开始)lookahead (只执行检查而不是比赛结果的一部分)

    echo preg_replace('~(<img\s.*?\bsrc=".*?)(".*?>)~si', '$1?ttl=3600$2', $str);

但是,请记住,HTML代码可能充满了陷阱(单引号之间的属性或根本没有引号,没有src属性的img标签,等号周围未定义的空格数,属性值或包含字符串echo preg_replace('~<img\s.*?\bsrc=".*?\K(?=".*?>)~si', '?ttl=3600', $str); ...)的文本内容。这就是为什么,最干净的解决方案是使用特定的工具来处理HTML。

DOMDocument的一个例子:

src="

如果您处理的是HTML而不是整个文档,并且您的PHP版本大于或等于5.3.6,则可以将最后一行替换为:

$dom = new DOMDocument();
@$dom->loadHTML($str);
$imgNodes = $dom->getElementsByTagName('img');
foreach($imgNodes as $imgNode) {
    if ($imgNode->hasAttribute('src') && !empty($src = $imgNode->getAttribute('src')))
        $imgNode->setAttribute('src', $src . '?ttl=3600');
}
$result = $dom->saveHTML();