Вопрос по регулярным выражениям в PHP

12
T
На сайте с 24.07.2008
Offline
145
809

Дано:

строка = <a><c>34</c><b>534</b></a><b>23</b>

Надо выдрать 534, условие чтобы была вложенность a\b. Т.е. 23 уже не в a, поэтому оно не надо.

Регулярка:

/<a>[^<\/a>]<b>(\d+)/i

Проблема в том что [] - это символьный класс, т.е. мы будем искать любой из перечисленных символов, а мне надо чтобы он конкретную фразу нашел, т.е. конкретную последовательность символов. И если этой фразы нет, то всё норм и б на самом деле вложено в а, и это число нам надо )))

Как это делать? )))

Tempter добавил 27.11.2008 в 15:46

забыл сказать что это PCRE, т.е. регулярка для preg_match )))

DI
На сайте с 03.01.2007
Offline
123
#1

#<a>.*?<b>(.+?)<\/b><\/a>#is

самый прямолинейный, но работающий способ:)

Высказывание идиотского утверждения требует на порядок меньше усилий, чем его последовательное и обоснованное опровержение и более того, иногда это опровержение вообще невозможно. © (http://zhurnal.lib.ru/s/shapiro_m_a/raspidiota.shtml)
T
На сайте с 24.07.2008
Offline
145
#2

хм, я думал о таком варианте но чо-та стреманулся )))

если строка будет такая:

<a><c>34</c><b>534</b><d>234</d><b>643</b></a><b>23</b><a><c>2367</c></a>

и скрипт соответственно:

preg_match_all('/<a>.*?<b>(.+?)<\/b><\/a>/i', $string, $matches);

поймаются ли 534 и 643, или нет? )))

и если да, то помоему он всё-таки схавает и 23 )))

DI
На сайте с 03.01.2007
Offline
123
#3

нет, вообще ничего не поймается в таком случае, точнее поймается '534</b><d>234</d><b>643'

чего выдернуть-то надо?:) одно значение или несколько?

zhidronsss
На сайте с 12.10.2007
Offline
36
#4

будет работать-

<a>.*?<c>.*?<\/c>.*?<b>([\d]+)<\/b>.*?<\/a>.*?<b>.*?<\/b>

CE
На сайте с 30.01.2008
Offline
73
#5

Xpath: //a/b

DI
На сайте с 03.01.2007
Offline
123
#6

zhidronsss, если нужно только одно значение, то будет работать и без промежуточных тегов:

<a>.*?<b>(.+?)<\/b>

Все, как только <b> закрылся - срабатывает жадность и регулярка заканчивается.

N
На сайте с 06.05.2007
Offline
419
#7

обрабатывать регулярными выражениями HTML - крайне унылое занятие. в XXI веке все это делается через XPath.

одна проблема - некоторые старые документы представляют из себя неправильный XML и приходится прибегать к ухищрениям.

Кнопка вызова админа ()
zhidronsss
На сайте с 12.10.2007
Offline
36
#8

<a>.*?<b>(.+?)<\/b> -отличное компактное решение

<a>.*?<c>.*?<\/c>.*?<b>([\d]+)<\/b>.*?<\/a>.*?<b>.*?<\/b> -наглядное решение

DI
На сайте с 03.01.2007
Offline
123
#9
netwind:
одна проблема - некоторые старые документы представляют из себя неправильный XML и приходится прибегать к ухищрениям.

Я бы сказал, подавляющее большинство html-страниц, особенно эволюционирующих в процессе жизни (навешивание всякой фигни в макеты и т.п.) - представляют из себя абсолютно неправильный XML. И Xpath (имхо, конечно же) тут будет смотреться совсем не к месту, html и xml - это разные вещи.

N
На сайте с 06.05.2007
Offline
419
#10

DenIT, не знаю чем вы пользуетесь, но некоторые реализации XPath не спотыкаются от неправильного XML. Некоторые блоки документа парсер просто проигнорирует :

<p>

<pre>A</pre>

B

<pre>C</pre>

D

<pre>E</pre>

F

</p>

кто сможет здесь выбрать строку "D" через Xpath ?

Я так и не смог. поэтому применяю комбинированное решение : xpath + регулярные выражения. Мне кажется так проще.

12

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий