рег.эксп.найти тег с атрибутом - PullRequest
0 голосов
/ 24 июня 2010

Мне нужен reg exp (чтобы сделать preg_replace), чтобы найти все <font> теги с атрибутом style="..." ...

проблема в том, что мне нужно сопоставить ТОЛЬКО <font> с атрибутом стиля И значением

"height: 0;overflow: hidden;width: 0; position: absolute;"...

другая проблема, атрибут style может находиться в разных позициях;

отл.

<font  color="white"  style="height: 0;overflow: hidden;width: 0; position: absolute; font-family:courier; font-size:10px" >

или

<font  style="height: 0;overflow: hidden;width: 0; position: absolute; font-family:tahoma; font-size:14px" color="red"   >

РЕДАКТИРОВАТЬ: решено с помощью:

#</?font [^>]*\bheight: 0;overflow: hidden;width: 0; position: absolute;[^>]* >(.+</font[^>]*>|)#is

(найти тег с этим стилем и всем, что в нем содержится)

похоже, что reg exp в preg_replace () работает !!

Ответы [ 2 ]

3 голосов
/ 24 июня 2010

Вы можете использовать следующее выражение XPath для получения всех тегов <font> (при условии, что ваш HTML-документ правильно сформирован):

//font[@style='height: 0;overflow: hidden;width: 0; position: absolute;']

В PHP существует много способов запуска выражений XPath для документов, например это .

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

font[style*='height: 0;overflow: hidden;width: 0; position: absolute;']

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

1 голос
/ 24 июня 2010

Если вы уверены, что ваш HTML достаточно хорош, чтобы быть доступным для Regex (т. Е. Нет комментариев, ничего не искажено, стиль css не содержит комментариев, ...) и хотите соответствовать только открывающему тегу (вложение являетсянет-нет с регулярным выражением), вы можете попробовать

<font [^>]*\bstyle="([^"]*)"[^>]*>

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

Редактировать: Может быть, я неправильно понял вопрос.Если вам нужно, чтобы атрибутом стиля было указанное вами значение, используйте

<font [^>]*\bstyle="height: 0;overflow: hidden;width: 0; position: absolute;"[^>]*>
...