Регулярное выражение для замены a-тегов в HTML, где href-атрибут, начинающийся с http://

#html #regex #coldfusion #replace

#HTML #регулярное выражение #coldfusion #заменить

Вопрос:

Я хочу сопоставить все ссылки в моей переменной HTML-содержимого, где href начинается с http://www.example.com

Пример

должно соответствовать:

<a href="http://www.example.com">foo</a>

не должно совпадать:

<a href="/bar/">bar</a>

также соответствует (с разрывами строк и другими HTML-тегами внутри привязки):

 <a class="bla" id="blubb" href="http://www.example.com/asdf/" title="oops">
<img src="..." alt="" />
</a>
  

Я начал с чего-то вроде этого:

 <CFSAVECONTENT variable="html">
    <a class="bla" id="blubb" href="http://www.example.com/asdf/" title="oops">
        <img src="..." alt="" /> some Text
    </a>
</CFSAVECONTENT>
<CFSET result = REReplace(html, "<a[^>]*href="http://www.example.com[^"]*"[^>]?>([^<] )</a>", "1") />
  

но, конечно, это не будет соответствовать моему последнему примеру ссылки с img-тегом внутри a-tag …

Какие-либо подсказки по этому поводу?

Комментарии:

1. При дальнейшем исследовании заголовок вопроса не соответствует тому, что вы спрашиваете: вы хотите сопоставить все ссылки, начинающиеся с http://, или все ссылки, начинающиеся с example.com ? Мне придется изменить свой ответ на основе того, что вы хотите.

2. Он должен соответствовать всем ссылкам, начинающимся с example.com

Ответ №1:

Предполагая:

 <CFSAVECONTENT variable="html">
    <a class="bla" id="blubb" href="http://www.example.com/asdf/" title="oops">
        <img src="..." alt="" /> some Text
    </a>
    <a href="http://www.example.com/foo">foo</a>
    <a href="http://www.yahoo.com">abc</a>
    <a href="http://www.example.com/bar">bar</a>
</CFSAVECONTENT>
  

Используйте:

 <cfset links = ReMatch('<a[^>]*href="http://www.example.com[^"]*"[^>]*>(. ?)</a>', html) />
  

«ссылки» теперь представляют собой массив совпадающих URL-адресов (якоря 1, 2 и 4 должны быть в массиве).

Имейте в виду, что мой ответ был сформулирован в предположении, что вы хотели сопоставить все якоря, которые начинаются с http://www.example.com , что может не обязательно соответствовать тому, что вы задавали в названии этого вопроса.

Комментарии:

1. Спасибо! Теперь я понял: <CFLOOP array=»#links#» index=»link»> <CFSET html = replace(html, link, mid(link, find(«>»,link) 1, len(link)-find(«>»,link)-4)) /> </CFLOOP>

Ответ №2:

Может быть сложно и опасно пытаться использовать regex против HTML, подобного этому (особенно, если это не ваш HTML, а «дикий» код из Интернета), по целому ряду причин.

Правильным инструментом для этой работы является синтаксический анализатор HTML, который может предоставить вам DOM для манипулирования.

К сожалению, для CF их нет, поэтому вам нужно посмотреть на Java. Я слышал хорошие вещи о Jericho, но никогда не использовал его сам.

Комментарии:

1. Неправильное регулярное выражение потенциально может позволить внедрение JavaScript (т.Е. межсайтовый скриптинг).

2. Кроме того, более вероятно (но просто «раздражает», а не «опасно»), что это может привести к недопустимой разметке и, таким образом, заставить страницу делать странные вещи.

3. Однако я не могу не согласиться с этой логикой, OP спрашивает, как сопоставить — не обязательно, что он планирует делать с соответствующим содержимым.