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.
The main RegEx
I'll be using is as follows:
<img\s+[^>]*?src=("|')([^"']+)\1
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 --->
<cfloop condition="matcher.find()">
<cfset src = matcher.group(2) />
</cfloop>
UPDATE :
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)