Take the 2-minute tour ×

How would I match images that is not nested inside an anchor tag using regular expression?

Here is what I want:

No match: <a href="index.html"><img src="images/default.jpg" /></a>

Match: <div><img src="images/default.jpg" /></div>

Match: <img src="images/default.jpg" />

I'm no good at regex but this is what I came up so far, which doesn't work:


I couldn't use lookarounds since PHP wants it to be specific.

share|improve this question

2 Answers 2

up vote 1 down vote accepted

Much of the reason behind your difficulty is simply that HTML is not a regular language, see: Coding Horror: Parsing Html the Cthulhu Way

Consider using a query expression language powerful enough to process (X)HTML, or just using the DOM programmatically to fetch all image tags and then exclude those with <a> ancestors.

In PHP5, I believe you can use DOMXPath, using that it becomes as simple as:

$generated_string = '<a href="index.html"><img src="images/inside_a.jpg" /></a>' .
                    '<div><img src="images/inside_div.jpg" /></div>' .
                    '<img src="images/inside_nothing.jpg" />';

$doc = new DOMDocument();
$xpath = new DOMXpath($doc);

$elements = $xpath->query("//*[not(self::a)]/img");

foreach ($elements as $element){
  echo $doc->saveXML($element) . "\n";

This code would give the output:

<img src="images/inside_div.jpg"/>
<img src="images/inside_nothing.jpg"/>
share|improve this answer
The html content is from a generated string not a file. –  user1105430 Nov 6 '12 at 5:59
Not a problem, use $doc->loadHTML($generated_string) in that case. –  Ben Axnick Nov 6 '12 at 6:20
Updated my example for operating on a string instead of an HTML file –  Ben Axnick Nov 6 '12 at 6:39


share|improve this answer

Your Answer


