Проблема изображения регулярных выражений в BBCode - PullRequest
0 голосов
/ 09 января 2011

Я работаю над чем-то для своего phpBB3 и пытаюсь преобразовать эти смайлы обратно в исходное состояние смайликов, например,

:)  :(  :O  :P

Поскольку HTML-код смайлика содержит это:

/<img src=".*" alt="(.*)" title=".*">/gi

Заменено на:

$1

Однако, когда у меня несколько смайликов, он просто показывает последний смайлик, например, если это было так:

alt text http://uimgz.com/i/R2e3H8g5D8.png

Получается следующее:

:twisted:

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

:) :o :twisted:

Регулярное выражение кажется нормальным, но я не понимаю, в чем проблема, все регулярные выражения проходят цикл замены с использованием цикла for(), так что это не проблема.

Несколько смайликов HTML:

<img src="./images/smilies/icon_e_smile.gif" alt=":)" title="Smile" /> <img src="./images/smilies/icon_e_surprised.gif" alt=":o" title="Surprised" /> <img src="./images/smilies/icon_twisted.gif" alt=":twisted:" title="Twisted Evil" />

Ответы [ 2 ]

1 голос
/ 09 января 2011

Используйте *? и +? для сопоставления без жадности:

/<img src=".*?" alt="(.+?)" title=".*?">/gi

То, что происходит в вашем ошибочном примере, заключается в том, что первый .* соответствует всему этому:

./images/smilies/icon_e_smile.gif" alt=":)" title="Smile" /> <img src="./images/smilies/icon_e_surprised.gif" alt=":o" title="Surprised" /> <img src="./images/smilies/icon_twisted.gif

, который все еще производит действительное совпадение, но это не то, что вы хотите.? после * / + заставляет регулярное выражение потреблять наименьшую строку, необходимую для успешного сопоставления.Прочитайте раздел «Остерегайтесь жадности!»в этой статье .

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

1 голос
/ 09 января 2011

Измените регулярное выражение на это и попробуйте снова:

/<img src="[^"]*" alt="([^"]+)" title="[^"]*">/gi

Двигатель регулярных выражений обычно жадный. Он будет пытаться сопоставить самый длинный текст, соответствующий чему-либо. В вашем случае я сопоставил все три ссылки как одну. Здесь я ограничил содержание внутри атрибута src так, чтобы оно не содержало «, чтобы оно не совпадало полностью с третьим источником. Он рассматривал это как атрибут src ./images/smilies/icon_e_smile.gif" alt=":)" title="Smile" /> <img src="./images/smilies/icon_e_surprised.gif" alt=":o" title="Surprised" /> <img src="./images/smilies/icon_twisted.gif

...