If you're truly only looking for images, why not parse any
src attributes you can find? As it stands, all of the provided Regular Expressions will fail on local images, as well as on dynamically generated images, such as:
<img src="/local/images/get_profile_pic.php?id=12345" title="John Doe" />
This is perfectly valid, and none of the other expressions would capture them. Generally, for parsing HTML, you're better of traversing it with something like an XML reader, or a DOM builder, depending on how well the HTML is formed.
Ben Nadel has a pretty good blog article on working with badly formed HTML and translating into an XML document. Once you have an XML document, you can unleash the power of
XPath to do some very nice searching.
If, however, you just want a quick and dirty
RegEx to get the job done, I'd recommend actually using the underlying
Java Regular Expression library, as it's probably more efficient when matching multiple items over a large document.
RegEx I'll be using is as follows:
Which looks for the
src attribute in
img tags. You can vary this as you see fit.
<cfset html = variables.getDocument /> <!--- your HTML --->
<cfset pattern = CreateObject("java","java.util.regex.Pattern").compile('(?i)<img\s+[^>]*?src=("|')([^"']+)\1') />
<cfset matcher = pattern.matcher(html) />
<!--- loop through the matches --->
<cfset src = matcher.group(2) />
Here's an explanation of the pattern I chose:
<img - Literal string "<img", match the opening tag
\s+ - Match one or more whitespace characters, so <img\t is valid
[^>]*? - Lazily match any character that is not a '>' while looking for the next literal string
src= - Literal string "src="
("|') - Match either a single or a double quote, both are valid in HTML
([^"']+) - Match anything that isn't a single or double quote. Note: You *could* use [^\1] here, however this way the match will reject malformed HTML attributes that have mismatched quotes
\1 - Match the value of the first group (either a single or double quote)