Regex для замены амперсандов, но не когда они в URL

Итак, у меня есть это регулярное выражение:

&(?!#?[xX]?(?:[0-9a-fA-F]+|\w+);)

Это соответствует всем & в блоке текста

Однако, если у меня есть эта строка:

& & & & & <a href="http://localhost/MyFile.aspx?mything=2&this=4">My Text &</a>
---------------------------------------------------------^

... помеченный & также получает таргетинг - и, поскольку я использую его для замены & 's на &, URL становится недействительным:

http://localhost/MyFile.aspx?mything=2&amp;this=4

D'о! Кто-нибудь знает лучший способ кодирования &, которые не в URL.

2 ответа

Решение

Нет, URL не становится недействительным. HTML-код становится:

<a href="http://localhost/MyFile.aspx?mything=2&amp;this=4">

Это означает, что код, который не был правильно закодирован, теперь правильно закодирован, и фактический URL-адрес, содержащийся в ссылке:

http://localhost/MyFile.aspx?mything=2&this=4

Таким образом, не проблема в том, что символ & в коде закодирован, наоборот, код теперь корректен.

В PowerShell это можно сделать так:

$String ='& & & & & <a href="http://localhost/MyFile.aspx?mything=2&this=4">My Text &</a>'
$String -replace '(?<!<[^<>]*)&', "&amp;"

доходность

&amp; &amp; &amp; &amp; &amp; <a href="http://localhost/MyFile.aspx?mything=2&this=4">My Text &amp;</a>

Рассекая регулярное выражение:

  1. Осмотр (?
  2. Все строки будут найдены и заменены.
Другие вопросы по тегам