Как использовать (ActionScript 3) RegEx для сопоставления тега с необязательными атрибутами, одним конкретным атрибутом / значением и сохранения его содержимого? - PullRequest
0 голосов
/ 04 марта 2011

Я не новичок в регулярных выражениях, но столкнулся с проблемой, которую не могу решить.Я пытаюсь найти определенный HTML-тег, который имеет определенную пару атрибут / значение (у него могут быть и другие атрибуты, но они не обязательны), извлечь его содержимое в виде обратной ссылки и обернуть вокруг него новый пользовательский тег.Оригинальный тег:

<p backgroundColor="#0066cc" color="#0066cc" lineHeight="18" paragraphSpaceAfter="15" paragraphSpaceBefore="15" fontSize="24">This is my second paragraph, with some <span fontStyle="italic">inline stuff</span>too.</p>

Я хотел бы получить его:

<custom_heading>This is my second paragraph, with some <span fontStyle="italic">inline stuff</span>too.</custom_heading>

Выражение, которое я сейчас использую, это:

r = new RegExp("<p[^<]*backgroundColor=\"#0066cc\"[^>?]*\>","gi");
            s=s.replace(r,"<bwt_heading>");

Это работает нормально (замена только открывающего тега), пока я не попытаюсь добавить содержимое, а закрывающий тег:

<p[^<]*backgroundColor=\"#0066cc\"[^>?]*\>(.*?)</p>

Вышеуказанное ничего не соответствует, не заменяет вообще.Пожалуйста помоги!Мне удалось заменить несколько других тегов (и сохранить их содержимое с помощью обратной ссылки, например так:

<span>

1 Ответ

0 голосов
/ 04 марта 2011

Если короткое регулярное выражение работает, длинное тоже должно работать - если только нет строк перевода между <p> и </p>.Вы пробовали это с ([\s\S]*?) вместо (.*?)?

Кроме того, у вас есть [^<]* и [^>?]* в вашем исходном регулярном выражении, ни одно из которых не кажется правильным.Я подозреваю, что они оба должны быть [^>]*.


РЕДАКТИРОВАТЬ: появляется AS3 поддерживает модификатор s для режима dotall (он же однострочный или точка-совпадения-новые строки режим), что приятно.ActionScript предположительно реализует стандарт ECMAScript, который (начиная с версии 3) не поддерживает режим dotall , что требует взлома [\s\S], который мы все знаем и любим из регулярных выражений JavaScript.

В таком случае ваше регулярное выражение вообще не нужно менять:

r = new RegExp("<p[^>]*backgroundColor=\"#0066cc\"[^>]*>(.*?)</p>","gis");
s=s.replace(r,"<bwt_heading>$1</bwt_heading>");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...