Url Replace With Anchor, Not Replacing Existing Anchors
Solution 1:
Maybe something like this?
/(?:(?:ht|f)tps?:\/\/|www)[^<>\]]+?(?![^<>\]]*([>]|<\/))(?=[\s!,?\]]|$)/gm
And then trim the dots at the end if any.
Though if the link contains more punctuations, it might cause some issues... I would then suggest capturing the link first, then remove the trailing punctuations with a second replace.
[^<>\]]+
will match every character except <
, >
and ]
(?![^<>\]]*([>]|<\/))
prevents the matching of a link between html tags.
(?=[\s!,?\]]|$)
is for the punctuations and whitespace.
Solution 2:
Following regex should work. It's giving desired result on your sample inputs.
/((?:(?:ht|f)tps?:\/\/|www)[^\s,?!]+(?!.*<\/a>))/gm
See it in action here
(?!.*<\/a>)
- Negative lookahead for anchor
Matching content will be stored in $1
and can be used in replace string.
EDIT
To not match content with <img src ..
following can be used
(^(?!.*<img\s+src)(?:(?:ht|f)tps?:\/\/|www)[^\s,?!]+(?!.*<\/a>))
Solution 3:
can p.replace
be a function? if so:
var text = 'http://www.example.com \n' +
'http://www.example.com/test \n' +
'http://example.com/test \n' +
'www.example.com/test \n' +
'<a href="http://www.example.com">http://www.example.com </a>\n' +
'<a href="http://www.example.com/test">http://www.example.com/test </a>\n' +
'<a href="http://example.com/test">http://example.com/test </a>\n' +
'<a href="www.example.com/test">www.example.com/test </a>';
var p = {
flag: true,
pattern: /(<a[^<]*<\/a>)|((ht|f)tps?:\/\/|www\.).*?(?=\s|$)/ig,
replace: function ($0, $1) {
if ($1) {
return$0;
} else {
p.flag =true;
return"construct replacement string here";
}
}
};
while(p.flag){
p.flag =false;
text = text.replace(p.pattern, p.replace);
}
The part of the regex I added is (<a[^<]*<\/a>)|
to check if the url is anywhere inside an anchor, if so then the replacement function ignores it.
If you want to avoid the url inside <a href="...">
but other urls inside the anchor are to be replaced, then change (<a[^<]*<\/a>)|
to (<a[^>]*>)|
Post a Comment for "Url Replace With Anchor, Not Replacing Existing Anchors"