Replacing image src in HTML tags?

I want to use regex to replace src html attributes. The HTML is not malformed and fortunately takes the same form in all the pages in the database – i.e.

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

I have code that works fine if there’s only one image in the page. I want to know the best way to replace multiple images, as this one will replace all the image tags with the same string.

$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="https://x.y/a/' . $number . '.png"', $matches[0][$i]);
    }
}

So if the page contains two files, one called 1.png and one called 2.png the script should parse the numbers and replace them with a different url such as http://x.y/a/1.png and http://x.y/a/2.png.

I’ve heard preg_replace_callback is the best way to do this but I have no idea how to get this working… Help!

Here is Solutions:

We have many solutions to this problem, But we recommend you to use the first solution because it is tested & true solution that will 100% work for you.

Solution 1

Don’t use regular expressions for irregular languages like HTML. Use a parser instead. It will save you a lot of time and pain.

# 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();

Note that you will need something like DOMDocument::loadHtml(), if your html is not xhtml (i.e. valid xml), but the idea remains the same.

Solution 2

Add the global replace flag “g” in your regex.

‘/your_regex/ig

As soulmerge suggested, Since your html is not malformed(I assume you mean it is well-formed XML), An XSLT transformation would be an effective way to alter anything in your document too. You could match on the @src attribute and alter it as per your requirements.

You can also match on any other tags / attributes if you need to alter some other parts of the document at the same time.

Note: Use and implement solution 1 because this method fully tested our system.
Thank you 🙂

All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0

Leave a Reply