- Поисковые системы
- Практика оптимизации
- Трафик для сайтов
- Монетизация сайтов
- Сайтостроение
- Социальный Маркетинг
- Общение профессионалов
- Биржа и продажа
- Финансовые объявления
- Работа на постоянной основе
- Сайты - покупка, продажа
- Соцсети: страницы, группы, приложения
- Сайты без доменов
- Трафик, тизерная и баннерная реклама
- Продажа, оценка, регистрация доменов
- Ссылки - обмен, покупка, продажа
- Программы и скрипты
- Размещение статей
- Инфопродукты
- Прочие цифровые товары
- Работа и услуги для вебмастера
- Оптимизация, продвижение и аудит
- Ведение рекламных кампаний
- Услуги в области SMM
- Программирование
- Администрирование серверов и сайтов
- Прокси, ВПН, анонимайзеры, IP
- Платное обучение, вебинары
- Регистрация в каталогах
- Копирайтинг, переводы
- Дизайн
- Usability: консультации и аудит
- Изготовление сайтов
- Наполнение сайтов
- Прочие услуги
- Не про работу

Маркетинг для шоколадной фабрики. На 34% выше средний чек
Через устранение узких мест
Оксана Мамчуева
Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий
Дано:
строка = <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 )))
#<a>.*?<b>(.+?)<\/b><\/a>#is
самый прямолинейный, но работающий способ:)
хм, я думал о таком варианте но чо-та стреманулся )))
если строка будет такая:
<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 )))
нет, вообще ничего не поймается в таком случае, точнее поймается '534</b><d>234</d><b>643'
чего выдернуть-то надо?:) одно значение или несколько?
будет работать-
<a>.*?<c>.*?<\/c>.*?<b>([\d]+)<\/b>.*?<\/a>.*?<b>.*?<\/b>
Xpath: //a/b
zhidronsss, если нужно только одно значение, то будет работать и без промежуточных тегов:
<a>.*?<b>(.+?)<\/b>
Все, как только <b> закрылся - срабатывает жадность и регулярка заканчивается.
обрабатывать регулярными выражениями HTML - крайне унылое занятие. в XXI веке все это делается через XPath.
одна проблема - некоторые старые документы представляют из себя неправильный XML и приходится прибегать к ухищрениям.
<a>.*?<b>(.+?)<\/b> -отличное компактное решение
<a>.*?<c>.*?<\/c>.*?<b>([\d]+)<\/b>.*?<\/a>.*?<b>.*?<\/b> -наглядное решение
одна проблема - некоторые старые документы представляют из себя неправильный XML и приходится прибегать к ухищрениям.
Я бы сказал, подавляющее большинство html-страниц, особенно эволюционирующих в процессе жизни (навешивание всякой фигни в макеты и т.п.) - представляют из себя абсолютно неправильный XML. И Xpath (имхо, конечно же) тут будет смотреться совсем не к месту, html и xml - это разные вещи.
DenIT, не знаю чем вы пользуетесь, но некоторые реализации XPath не спотыкаются от неправильного XML. Некоторые блоки документа парсер просто проигнорирует :
<p>
<pre>A</pre>
B
<pre>C</pre>
D
<pre>E</pre>
F
</p>
кто сможет здесь выбрать строку "D" через Xpath ?
Я так и не смог. поэтому применяю комбинированное решение : xpath + регулярные выражения. Мне кажется так проще.