I have a paragraph of text in a javascript variable called 'input_content' and that text contains multiple anchor tags/links. I would like to match all of the anchor tags and extract anchor text and URL, and put it into an array like (or similar to) this:
Array ( [0] => Array ( [0] => <a href="http://yahoo.com">Yahoo</a> [1] => http://yahoo.com [2] => Yahoo ) [1] => Array ( [0] => <a href="http://google.com">Google</a> [1] => http://google.com [2] => Google ) )
I've taken a crack at it (http://pastie.org/339755), but I am stumped beyond this point. Thanks for the help!
var matches = [];
input_content.replace(/[^<]*(<a href="([^"]+)">([^<]+)<\/a>)/g, function () {
matches.push(Array.prototype.slice.call(arguments, 1, 4))
});
This assumes that your anchors will always be in the form <a href="...">...</a>
i.e. it won't work if there are any other attributes (for example, target
). The regular expression can be improved to accommodate this.
To break down the regular expression:
/ -> start regular expression [^<]* -> skip all characters until the first < ( -> start capturing first token <a href=" -> capture first bit of anchor ( -> start capturing second token [^"]+ -> capture all characters until a " ) -> end capturing second token "> -> capture more of the anchor ( -> start capturing third token [^<]+ -> capture all characters until a < ) -> end capturing third token <\/a> -> capture last bit of anchor ) -> end capturing first token /g -> end regular expression, add global flag to match all anchors in string
Each call to our anonymous function will receive three tokens as the second, third and fourth arguments, namely arguments[1], arguments[2], arguments[3]:
We'll use a hack to push these three arguments as a new array into our main matches
array. The arguments
built-in variable is not a true JavaScript Array, so we'll have to apply the split
Array method on it to extract the items we want:
Array.prototype.slice.call(arguments, 1, 4)
This will extract items from arguments
starting at index 1 and ending (not inclusive) at index 4.
var input_content = "blah \
<a href=\"http://yahoo.com\">Yahoo</a> \
blah \
<a href=\"http://google.com\">Google</a> \
blah";
var matches = [];
input_content.replace(/[^<]*(<a href="([^"]+)">([^<]+)<\/a>)/g, function () {
matches.push(Array.prototype.slice.call(arguments, 1, 4));
});
alert(matches.join("\n"));
Gives:
<a href="http://yahoo.com">Yahoo</a>,http://yahoo.com,Yahoo <a href="http://google.com">Google</a>,http://google.com,Google
Since you're presumably running the javascript in a web browser, regex seems like a bad idea for this. If the paragraph came from the page in the first place, get a handle for the container, call .getElementsByTagName()
to get the anchors, and then extract the values you want that way.
If that's not possible then create a new html element object, assign your text to it's .innerHTML property, and then call .getElementsByTagName()
.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With