2010-12-12 2 views
1

Я бы хотел заменить (все вхождения) HTML <font> -tag в строке.Замена тега шрифта html с помощью regex

Пример строки:

Line1<div><font class="blablabla" color="#33FF33">Line2</font></div><div>Line3 

или:

Line1<div><font color="#33FF33">Line2</font></div><div><font color="#FF3300">Li</font>ne3 

Шрифт (STARTTAG) следует заменить на цвет, так что на основании этих двух примеров мы получаем:

Line1<div>33FF33Line2</font></div><div>Line3 
Line1<div>33FF33Line2</font></div><div>FF3300Li</font>ne3 

Я пробовал следующее (среди прочего: P):

preg_replace('/<font.*color="#([0-9a-fA-F]){6}">/', '{1}', $string) 

Я думаю, что я нахожусь в правильном направлении, однако я думаю, что это больше похоже на так близко еще так далеко :)

Когда я использую его на строку только с 1 fonttag в нем, он удаляет тег шрифта (я, должно быть, что-то перепутал с заменой {1}). Когда я использую его в строке с несколькими шрифтами в нем, он делает то же самое. Но не только удаление первого шрифта, но и всего от первого шрифта до следующего (или последнего) шрифта.

Хорошо.

Давайте просто забудем об обсуждении разбора HTML-кода в течение секунды.

Что делать, если у меня были следующие тексты:

This colorcode (#333333) is so cool 
This colorcode (orange: #ff3300) is way cooler 

И я хотел тексты стать:

This colorcode 333333 is so cool 
This colorcode ff3300 is way cooler 

Такая же ситуация, как я понимаю, или я не разумея сейчас?

+1

http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454 –

+0

возможный дубликат [Regex для выборочной зачистки HTML] (http://stackoverflow.com/questions/4393129/regex-for-selective-stripping-of-html) –

+0

, пожалуйста, пожалуйста, не пытайтесь анализировать HTML с регулярным выражением или наступают пони ... http://simplehtmldom.sourceforge.net/ –

ответ

3
preg_replace('~<font[^>]*\scolor="#([0-9a-fA-F]{6})"[^>]*>~', '$1', $string); 

* и другие кванторы жадные по умолчанию, поэтому вы получили непреднамеренное сокращение строки с несколькими тегами шрифтов; это просто слишком много. Вы можете сделать их не жадными, добавив вопросительный знак (.*?), но другие факторы все еще могут заставить их потреблять больше, чем вы хотите. Это лучше в этом случае использовать более конкретное выражение ([^>]*), которые не могут соответствовать за тэг он начинается в.

Кроме того, в коде вы публикуемыми вы использовали {1} вместо $1 для обратной ссылки, и у вас был квантификатор ({6}) вне круглых скобок, поэтому вы бы только фиксировали последнюю цифру, а не все шесть, как вы планировали. Этот код не должен был возвращать результат, вы отправили , не говоря уже о правильном результате.

Что касается обновленной вопрос:

preg_replace('~\([^)]*#([0-9a-fA-F]{6})[^)]*\)~', '$1', $string); 
+0

Спасибо за ваше объяснение! – PeeHaa

0

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

Я написал код паука и в итоге просто разбирал весь документ, элемент за элементом. Это был единственный способ сделать его надежным.

См: http://blackbeltcoder.com/Articles/strings/parsing-html-tags-in-c/

Смежные вопросы