Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум Регулярные Выражения

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Спарсить ваголовеи HTML
 
 автор: alver   (25.08.2011 в 08:55)   письмо автору
 
 

Всем привет, помогите составить регулярку.
Нужно вытащить текст из любых заголовков html (h1-h5)
При этом в заголовках могут быть любые другие теги.
К примеру:
<h1>Текст</h1> => Текст
<h1><a href="#">Текст</a></h1> => Текст
<h1><a href="#"><b>Текст1</b></a><a href="#">Текст2</a>Текст3</h1> =>  Текст1, Текст2, Текст3

Ну и так далее, т.е. нужен любой текст в заголовках h1 или из любых тегов в этих заголовках.
Вложенность может быть любой, это и ставит меня в ступор)
На данный момент есть это:
"/<h[1-9]{1}.*>(.*)<\/h[1-9]{1}>/isU" - парсит любой текст из заголовков, теги в том числе.
Можно конечно после применения этой регулярки вторым проходам вырезать все теги, но хотелось бы одним выражением!)

  Ответить  
 
 автор: cheops   (25.08.2011 в 10:26)   письмо автору
 
   для: alver   (25.08.2011 в 08:55)
 

Лучше для каждого вида тэгов создать свое регулярное выражение, а вместо (.*) использовать (.*?). Семантически заголовки не вкладывают друг в друга, но вообще это не запрещено.

  Ответить  
 
 автор: alver   (25.08.2011 в 11:17)   письмо автору
 
   для: cheops   (25.08.2011 в 10:26)
 

Заголовки то не вкладываются, но например подобные выражения:
<h1><a href="">Текст</a></h1>=>Текст

встречается регулярно.
Для каждого вида тегов имеете ввиду внутри заголовков?

  Ответить  
 
 автор: f111   (25.08.2011 в 23:44)   письмо автору
 
   для: alver   (25.08.2011 в 11:17)
 

думал, думал, но ничё толкового не придумал, остановился на таком варианте:
|<h[1-5].*?>(?:(?:<[^<>]+?>)*([\wа-яА-Я]+)(?:<[^<>]+?>)*)+</h[1-5]>|


текст:
<h1>Текст</h1>
<h3><a href="#">Текст</a></h3>
<h4 style="text-align:center"><a href="#">Текст</a></h4>
<h1><a href="#"><b>Текст1</b></a><a href="#">Текст2</a>Текст3</h1>


результат:
Всего совпадений 4

1 : <h1>Текст</h1>
1.1 : Текст

2 : <h3><a href="#">Текст</a></h3>
2.1 : Текст

3 : <h4 style="text-align:center"><a href="#">Текст</a></h4>
3.1 : Текст

4 : <h1><a href="#"><b>Текст1</b></a><a href="#">Текст2</a>Текст3</h1>
4.1 : Текст3
с 4-ой строкой получается облом((

_____________
хотя можно получить всё содержимое заголовков ( |<h[1-5].*?>(.+?)</h[1-5]>| ), а потом пропустить через strip_tags

  Ответить  
 
 автор: alver   (26.08.2011 в 08:09)   письмо автору
 
   для: f111   (25.08.2011 в 23:44)
 

Хм. Спасибо. Получше моего варианта!)
У меня вот тоже со строками, подобной 4-ой - никак!
Видимо, в такой ситуации придётся в 2 этапа обрабатывать.
Нужно максимум данных выцепить!)

  Ответить  
 
 автор: f111   (25.08.2011 в 12:21)   письмо автору
 
   для: cheops   (25.08.2011 в 10:26)
 

>а вместо (.*) использовать (.*?).

в его предложенном варианте и так не жадные квантификаторы

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования