2009-11-05 5 views
-1

Так что у меня это регулярное выражение:Regex заменить амперсанд, но не тогда, когда они находятся в URL

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

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

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

& & & & & <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'oh! Кто-нибудь знает лучший способ кодирования &, которые являются не в URL.

+0

'\ w' уже соответствует всем символам класса' [0-9a-fA-F] '. Поэтому '(?: [0-9a-fA-F] + | \ w +)' может быть просто записано как '\ w +'. –

+0

За что голосовать? – Paul

+0

Ваш образец кода недействителен. Вы ** должны ** кодировать амперсанды по URL-адресам: http://htmlhelp.com/tools/validator/problems.html#amp – Quentin

ответ

4

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

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

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

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

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

+0

Хотя большинство браузеров могут ошибаться, если атрибут включает & this =, попытка с помощью & copy = продемонстрирует, что это настоящая проблема, и что атрибуты, содержащие URI, не являются исключениями для правил кодирования символов, которые имеют особое значение в HTML. – Quentin

+0

Неверный. Что, если источник ...? Один = два & три? – cletus

+0

Какой источник? Сырой источник? Тогда HTML для представления URL-адреса будет & amp ;. Или вы считаете, что OP имеет некоторый контент, который имеет атрибуты href HTML, закодированные, но не остальную часть содержимого? Потому что это будет ** очень ** странно. – Quentin

0

В 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. ВсеЗатем обнаруживаются и заменяются строки.