Regex 使用preg_替换内部标签

Regex 使用preg_替换内部标签,regex,preg-replace,Regex,Preg Replace,我想将所有url img src标记值从一个字符串更改为第二个字符串,如下所示: $str1 = "< img src="//d3kq20n0vvk93.cloudfiojiojront.net/cbbcadjiojoijc470efd702jijiojoijiojioc4.jpg" alt="">"; $str1=“

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

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

$str2=“”;
我尝试过这种方法,但在src=”“标记中不起作用:

print preg_替换('//si',“$0?ttl=3600”,$str);
我如何解决它?
提前感谢

它不起作用,因为
$0
指的是整个比赛(来自

  • 使用捕获组:

    echo preg\u replace(“~()~si”,“$1?ttl=3600$2”,“$str”);

  • 使用(从匹配结果重置匹配的开始)和(仅执行检查且不属于匹配结果的一部分)

    echo preg_替换('~)~si','?ttl=3600',$str)

但是,请记住,HTML代码可能充满陷阱(单引号之间的属性或根本没有引号、没有src属性的img标记、等号周围未定义的空格数、属性值或包含字符串
src=“
”的文本内容)这就是为什么,最干净的解决方案是使用特定的工具来处理HTML

DOMDocument的一个示例:

$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();
如果处理的是一段HTML而不是整个文档,并且PHP版本大于或等于5.3.6,则可以将最后一行替换为:

$result = $dom->saveHTML($dom->getElementsByTagName('body')->item(0));
$result = substr($result, 6, -7);
$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();
$result = $dom->saveHTML($dom->getElementsByTagName('body')->item(0));
$result = substr($result, 6, -7);