Регулярное выражение находит фразу не внутри тега HTML - PullRequest
0 голосов
/ 05 мая 2010

Я немного борюсь с этим регулярным выражением и спрашиваю себя, может ли кто-нибудь помочь мне, пожалуйста?

Что мне нужно сделать, это выделить первую фразу внутри строки, которая НЕ находится внутри тега HTML. Вот примеры, которые у меня есть на данный момент:

This is some test text about <acronym
title="Incomplete Test Syndrome"
class="CustomClass">ITS</acronym> for
the **ITS** department. Also worth
mentioning ABS as well I guess.ITS,

... и ...

This is some **ITS** test text about
<acronym title="Incomplete Test
Syndrome"
class="GOTManager">ITS</acronym> for
the ITS department. Also worth
mentioning ABS as well I guess

Так что в первом примере я хочу, чтобы он игнорировал завернутую ITS и дал мне ITS в конце 1-го предложения.

Во втором примере я хочу, чтобы он возвращал ITS в начале второго предложения.

Цель состоит в том, чтобы заменить их моими собственными упакованными тегами аббревиатуры в приложении ColdFusion, которое я пишу.

Большое спасибо, Джеймс

Ответы [ 3 ]

3 голосов
/ 05 мая 2010

Как отмечают комментаторы, регулярные выражения не являются хорошим инструментом для работы с XML / HTML-подобными текстами. Это потому, что находясь «внутри» чего-то очень сложно проверить в любой общности (вы никогда не знаете, на каком из этих возможных уровней неограниченного вложения вы находитесь).

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

Ваши примеры работают с

^(?:<[^<]*<[^>]*>|.)*?(ITS)

Это соответствует всей строке вплоть до первого вхождения ITS, отсутствующего в теге (и имеет это в своей первой группе захвата), но там должно быть легко извлечь нужные вам данные. Только сопоставление этого экземпляра ITS невозможно, так как ваша реализация регулярных выражений не поддерживает просмотр произвольной длины.

Спросите, хотите ли вы / нуждаетесь в объяснении выражения. =)

0 голосов
/ 05 мая 2010

Вы говорите:

Цель состоит в том, чтобы заменить их на мои собственные пользовательские теги аббревиатуры в Приложение ColdFusion, которое я пишу.

Похоже, использование XSL может быть более подходящим, чем регулярное выражение для преобразования одного тега в другой.

UPDATE:

Просто скомбинировал это, кажется, работает для простых случаев:

(ПРИМЕЧАНИЕ: это просто удалит теги 'acronym'. Вы можете использовать XSL, чтобы заменить их собственными пользовательскими тегами, но вы ничего не указали в этих строках, поэтому я не попал в что)

XSL:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:template match="*[name() = 'acronym']" />
</xsl:stylesheet>

Введите:

<?xml version="1.0" encoding="UTF-8"?>
<root>
This is some test text about <acronym
title="Incomplete Test Syndrome"
class="CustomClass">ITS</acronym> for
the **ITS** department. Also worth
mentioning ABS as well I guess.ITS,

This is some **ITS** test text about
<acronym title="Incomplete Test
Syndrome"
class="GOTManager">ITS</acronym> for
the ITS department. Also worth
mentioning ABS as well I guess
</root>

Вывод:

<?xml version="1.0" encoding="UTF-8"?>
This is some test text about  for
the **ITS** department. Also worth
mentioning ABS as well I guess.ITS,

This is some **ITS** test text about
 for
the ITS department. Also worth
mentioning ABS as well I guess

UPDATE:

Вы сказали:

Итак, в первом примере я хочу это игнорировать завернутый ЕГО и дать мне ЕГО в конце 1-го предложения.

Во втором примере я хочу это вернуть ЕГО в начале 2-го предложение.

Это не имеет смысла. Ваш второй пример не имеет "ITS" во втором предложении. Я думаю , что вы имели в виду, что **ITS** - это то, что вы хотите извлечь.

Образец XSL, который я дал, удаляет только теги <acronym/>, но после того, как это сделано, вы можете попытаться найти ITS в разных точках предложения, и, возможно, для этого регулярное выражение может быть легким (это предполагает, что вы ' ТОЛЬКО нужно беспокоиться о тегах <acronym/>).

0 голосов
/ 05 мая 2010

Я скажу вам то же самое, что сказал вам, когда вы задали очень похожий вопрос: Застрял с кодом регулярного выражения, чтобы применить тег HTML к тексту, но исключить, если внутри тега <?>

Вы НЕ МОЖЕТЕ разобрать HTML, включая вложенные элементы, с помощью регулярных выражений. Это известное ограничение регулярных выражений, которое хорошо документировано.

Вы можете попробовать установить и использовать внешний движок регулярных выражений с расширениями, которые могут работать. Вы можете вручную пройти строку, посчитав вложение, чтобы увидеть, не обернута ли строка, на которую вы смотрите. Вы можете использовать настоящий анализатор HTML, как WebKIT делает это внешне.

Но вы не можете сделать это с помощью регулярных выражений. Пожалуйста, ищите альтернативу. Черт, мы даже поможем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...