. Один из подходов к этой проблеме - использовать регулярное выражение со строгим шаблоном обратного просмотра, который позволяет очень близко привязывать якоря, которые следуют определенному формату.
Допустим, вы хотите разрешить только ссылки, которые точно следуют этому примеру:
<a href="http://host.domain/path?query#anchor">text</a>
и
<a href="https://host.domain/path?query#anchor">text</a>
Построить регулярное выражение, которое соответствует только «<» символы, которые не следуют этим действительный образец (отрицательный lookbehind):
<(?!a href="https?:\/\/\w[\w.-\/\?#]+">\w+<\/a>)
Одна из проблем с этим регулярным выражением состоит в том, что если вы сопоставляете его со всей строкой, <
по-прежнему будет соответствовать закрывающему элементу a
(</a>
), поэтому, если вы замените каждое совпадение на <
, вы в конце концов сломаете якорь.
Вы можете разрешить все закрывающие теги </a>
путем добавления альтернативу негативный взгляд-за:
<(?!a href="https?:\/\/\w[\w.-\/\?#]+">\w+<\/a>|\/a>)
Может быть кто-то еще лучшее решение для этой проблемы к югу.
Вот окончательный string.replace:
string.replace(/<(?!a href="https?:\/\/\w[\w.-\/\?#]+">\w+<\/a>|\/a>)/g, '<');
Примечание: Все эти входные проверки всегда должны быть сделаны на стороне сервера, на стороне клиента проверка может просто обойти, и вы будете на ваш сервер попадают вредоносные данные, несмотря на проверку.
Лучше не допускать HTML-код в строке и иметь предопределенный формат для вставки ссылок, аналогично тому, как это делает SO (например, '[linktext] (http://linkurl.com) '). Таким образом, вы не имеете HTML-кода в строке и имеете полный контроль над тем, что добавляется. –
@RajaprabhuAravindasamy, который не является дубликатом - он удаляет * все * HTML из строки. OP ищет, чтобы сохранить элементы 'a' (и, предположительно, и другие) –
@RoryMcCrossan А, я вижу. Я пропустил это чтение. –