Возможно, вам следует использовать DOM в соответствии с рекомендациями. Но чтобы заставить ваше регулярное выражение работать так, как вам нужно, вы должны добавить к нему (?:^|[^"'])
. Это означает совпадение начала строки или совпадение с любым символом, кроме '
и "
. Итак, первое из ваших регулярных выражений будет выглядеть следующим образом:
/(?:^|[^"'])(ftp|http|https|file):\/\/[\S]+(\b|$)/gim
И ваша цепочка из метода replace
ужасна. Код будет намного более читабельным, если вы разделите вызовы метода на разные строки.
Обновление: и чтобы пропустить первый лишний символ, вы можете использовать $1
вместо $&
, и ваше регулярное выражение должно быть изменено на:
/(?:^|[^"'])((ftp|http|https|file):\/\/[\S]+(\b|$))/gim