Как использовать ColdFusion для замены текста в HTML без замены тегов HTML? - PullRequest
0 голосов
/ 09 июля 2010

У меня есть источник HTML в качестве строковой переменной.И слово в качестве другой переменной, которая будет выделена в этом HTML-источнике.

Мне нужно Регулярное выражение, которое не выделяет теги, а содержит текст внутри тегов.

Например, у меня естьHTML-источник, такой как

<cfset html =  "<span>Text goes here, forr example it container also **span** </span>" />
<cfset wordToReplace = "span" />
<cfset html = ReReplace(html ,"[^(<#wordToReplace#\b[^>]*>)]","replaced","ALL")>

и я хочу получить это

<span>Text goes here, forr example it container also **replaced** </span>

Но у меня есть ошибка.Любой совет!

Ответы [ 2 ]

3 голосов
/ 09 июля 2010

Мне нужно регулярное выражение, которое не выделяет теги, а содержит текст внутри тегов.

Вы не найдете его.Не тот, который полностью надежен против любого легального / дикого HTML.

Простая причина в том, что регулярные выражения соответствуют регулярным языкам , а HTML даже удаленно не является регулярным языком.

Даже если вы очень осторожны, вы рискуете заменить вещи, которые вам не нужны, и не заменять вещи, которые вы хотели, просто из-за того, насколько сложным может быть синтаксис HTML.

Правильный способ синтаксического анализа HTML - это использование специального синтаксического анализатора HTML DOM.

К сожалению, CF не имеет встроенного, хотя, если ваш HTML - XHTML, вы можете использовать XmlParse и XmlSearch , чтобы позволить xpath искать только текст (не теги), который соответствует вашему тексту ... что-то вроде //*[contains(text(), 'span')] должно делать ( подробнее здесь).

Если у вас нет XHTML, вам нужно рассмотреть возможность использования HTML DOM-парсера для Java - Google находит много, (я еще не пробовал, поэтому могу 'дать конкретные рекомендации).

1 голос
/ 09 июля 2010

Что вам нужно сделать, это использовать lookahead , чтобы убедиться, что ваш текст не содержится внутри тега.Конечно, это можно написать лучше, но вы получите желаемый результат.он даже будет обрабатывать, когда у тега есть атрибуты.

<cfset html =  "<span class='me'>Text goes here, forr example it container also **span** </span>" />
<cfset wordToReplace = "span" />
<cfset html = ReReplace(html ,"(?!/?<)(#wordToReplace#)(?![^.*>]*>)","replaced","ALL")>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...