在HTML标签中替换图像src?

时间:2009-09-13 13:52:18

标签: php regex

我想使用正则表达式来替换src html属性。 HTML没有格式错误,幸运的是在数据库的所有页面中采用相同的形式 - 即

<img src="http://x.y/z/1.png" />

如果页面中只有一个图像,我的代码可以正常工作。我想知道替换多个图像的最佳方法,因为这个将用相同的字符串替换所有图像标记。

$result = $s->db_query("SELECT reviewFullText as f FROM reviews WHERE reviewsID = 155");
while($row = mysql_fetch_array($result))
{
    $body = stripslashes(html_entity_decode($row['f'], ENT_NOQUOTES, "UTF-8"));
    preg_match_all('/<img.*?(src\=[\'|"]{0,1}.*?[\'|"]{0,1})[\s|>]{1}/i', $body, $matches);
    for($i=0;$i<count($matches[0]);$i++)
    {
        $number = preg_replace("/[^0-9]/", '', $matches[0][$i]);
        echo preg_replace('/<img.*?(src\=[\'|"]{0,1}.*?[\'|"]{0,1})[\s|>]{1}/i', '<img src="http://x.y/a/' . $number . '.png"', $matches[0][$i]);
    }
}

因此,如果页面包含两个文件,一个名为1.png,另一个名为2.png,则脚本应解析这些数字并将其替换为其他网址,例如http://x.y/a/1.pnghttp://x.y/a/2.png。< / p>

我听说preg_replace_callback是最好的方法,但我不知道如何让这个工作......帮助!

2 个答案:

答案 0 :(得分:14)

Don't use regular expressions for irregular languages like HTML。请改用parser。它将为您节省大量时间和痛苦。

# Untested code:
$xml = new SimpleXml($xmlString);
foreach ($xml->xpath('//img') as $imgNode) {
    $imgNode->addAttribute('src', "http://x.y/a/" . $imgNode->getAttribute('src'));
}
echo $xml->asXML();

请注意,如果您的html不是xhtml(即有效的xml),则需要DOMDocument::loadHtml()之类的内容,但这个想法保持不变。

答案 1 :(得分:1)

在正则表达式中添加全局替换标记“g”。

'/ your_regex / 我克

正如soulmerge建议的那样,由于你的html没有格式错误(我认为你的意思是它是格式良好的XML),因此XSLT转换也是改变文档中任何内容的有效方法。您可以匹配@src属性并根据您的要求进行更改。

如果您需要同时更改文档的某些其他部分,也可以匹配任何其他标记/属性。