PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
mstdmstd
Отправлено: 02 Июня, 2016 - 14:53:33
Post Id


Гость


Покинул форум
Сообщений всего: 101
Дата рег-ции: Авг. 2014  


Помог: 0 раз(а)




Всем привет,
Чтобы разбить текст
PHP:
скопировать код в буфер обмена
  1.      $str= '<h3>header 1111</h3>text 11111<h3>header 222</h3>text 2222';
  2.  
на массив из заголовков и текста я использую регулярку

PHP:
скопировать код в буфер обмена
  1.          $ret = preg_match_all('~<h3>([^<]+)</h3>([^<h3>]+)~', $str, $matsches );

Она разбивает правильно...

Но если в заголовке или тексте есть теги она не работает...
А как правильно?
Спасибо !
 
 Top
Botik
Отправлено: 02 Июня, 2016 - 15:18:27
Post Id



Новичок


Покинул форум
Сообщений всего: 30
Дата рег-ции: Дек. 2008  
Откуда: Чебоксары


Помог: 0 раз(а)




PHP:
скопировать код в буфер обмена
  1. $ret = preg_match_all('~<h3>(.*?)</h3>(.*?)(<h3>)~', $str, $matsches);

(Отредактировано автором: 02 Июня, 2016 - 15:25:49)

 
 Top
mstdmstd
Отправлено: 03 Июня, 2016 - 09:44:52
Post Id


Гость


Покинул форум
Сообщений всего: 101
Дата рег-ции: Авг. 2014  


Помог: 0 раз(а)




Спасибо! так лучше, но если проверять строку из 4х строк
PHP:
скопировать код в буфер обмена
  1.      $str= '<h3>header <b>11</b>11</h3>text <b>11111</b><h3>header <b>222</b></h3>text <b>2222</b><h3>header <b>3333</b></h3>text <b>33333333</b><h3>header <b>444444</b></h3>text <b>44444</b>';
  2.  
то находит 1ю и 3ю строки, видимо из-за того что один <h3> используется для завершения блока и для начала следующего...
И как сделать чтобы разбивка работала если в тексте есть символы перевода строк?
 
 Top
Мелкий Супермодератор
Отправлено: 03 Июня, 2016 - 09:58:52
Post Id



Активный участник


Покинул форум
Сообщений всего: 11590
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 564 раз(а)




mstdmstd пишет:
то находит 1ю и 3ю строки, видимо из-за того что один <h3> используется для завершения блока и для начала следующего...

Верно. Вам нужны опережающие проверки:
~<h3>(.+?)</h3>(.+?)(?=<h3>|$)~

Альтернатива "или конец строки" нужна для обработки последнего вхождения.


-----
PostgreSQL DBA
 
 Top
mstdmstd
Отправлено: 03 Июня, 2016 - 10:57:54
Post Id


Гость


Покинул форум
Сообщений всего: 101
Дата рег-ции: Авг. 2014  


Помог: 0 раз(а)




Спасибо!

Но это был тестовый текст

Я попробовал взять реальный текст из базы:
CODE (htmlphp):
скопировать код в буфер обмена
  1. <h2>Grow your Business on <strong>tb.com.au</strong>!</h2>
  2. <address>tb.com.au, Australia's No.1 listed websites on Google, Bing and Yahoo.</address>
  3. <p>Be a part of Australia's premium tb location, create your online Hostel or Tour listing and start receiving enquiries.</p>
  4. <hr>
  5. <p>Our Hostel and Tour <strong>Standard Listings</strong> are <span  underline;">free</span> for a limited time only so register your operator account and get listed.</p>
  6. <p>Want more exposure? Boost your listing with our comprehensive <strong>Featured listings</strong> for $34.95AUD per month - less than a $1.20AUD per day!<br><br>Our <strong>Featured listings</strong> are rotated on our high-traffic homepage and take priority within the our search results - Meaning all featured listings will be listed above ALL standard listings.</p>
  7. <hr>
  8. <h3>HOSTELS</h3>
  9. <address>Each&nbsp;<strong>HOSTEL&nbsp;</strong>listing contains everything you need to know from:</address><address></address>
  10. <p></p>
  11. <ul>
  12. <li><address>Detailed Hostel Information</address></li>
  13. <li><address>Hostel Website Link</address></li>
  14. <li><em>Book Now Link</em></li>
  15. <li><address>Booking Enquiry Form</address></li>
  16. <li><address>Room Pricing</address></li>
  17. <li><address>Photo Gallery</address></li>
  18. <li><address>Extra Details</address></li>
  19. <li><address>Hostel Facilities</address></li>
  20. <li><address>About Us<em> (Operator)</em></address></li>
  21. <li><address>Cancellation Policy</address></li>
  22. <li><address>Hostel Policy</address></li>
  23. <li><address>Hostel Location</address></li>
  24. <li><address>tb Reviews</address></li>
  25. </ul>
  26. <h3>TOURS</h3>
  27. <address>Each&nbsp;<strong>TOUR&nbsp;</strong>listing contains everything you need to know from:</address><address></address>
  28. <p></p>
  29. <ul>
  30. <li><address>Detailed Tour Information</address></li>
  31. <li><address>Tour Website Link</address></li>
  32. <li><em>Book Now Link</em></li>
  33. <li><address>Booking Enquiry Form</address></li>
  34. <li><address>Tour Pricing</address></li>
  35. <li><address>Photo Gallery</address></li>
  36. <li><address>Tour Highlights</address></li>
  37. <li><address>About Us<em> (Operator)</em></address></li>
  38. <li><address>Tour Schedule & Pricing</address></li>
  39. <li><address>Additional Information</address></li>
  40. <li><address>tb Reviews</address></li>
  41. </ul>
  42. <p>For more details on our pricing create your free operator account and log in!</p>
  43.  

И разбивка перестала работать ...
Не подскажите почему ,
 
 Top
Мелкий Супермодератор
Отправлено: 03 Июня, 2016 - 11:24:13
Post Id



Активный участник


Покинул форум
Сообщений всего: 11590
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 564 раз(а)




Модификаторов не хватает.
По-умолчанию символ . не включает в себя символы перевода строки. Это модификатор s.

Скорей всего ещё пригодятся модификатор регистронезависимости i; если тексты в юникоде - то добавить u; модификатор m для корректировки работы начала и конца строки.


-----
PostgreSQL DBA
 
 Top
mstdmstd
Отправлено: 03 Июня, 2016 - 13:06:46
Post Id


Гость


Покинул форум
Сообщений всего: 101
Дата рег-ции: Авг. 2014  


Помог: 0 раз(а)




Спасибо похоже некоторые символы не проходят текст под заголовками для условия
PHP:
скопировать код в буфер обмена
  1.      $ret = preg_match_all('~<h3>(.+?)</h3>(.+?)(?=<h3>|$)~ium', $str, $matsches);

И еще вопрос а нет ли в онлайне аналога jfiddle-а для регулярных выражений ?
 
 Top
mstdmstd
Отправлено: 04 Июня, 2016 - 17:24:18
Post Id


Гость


Покинул форум
Сообщений всего: 101
Дата рег-ции: Авг. 2014  


Помог: 0 раз(а)




Тестируя также наткнулся что если текст внутри блоков в теги - то этот блок не находит
То есть если заголовок первого блока завернуть в параграф
PHP:
скопировать код в буфер обмена
  1.      $str= '<h3><p>header <b>11</b>11</p></h3>text <b>11111</b><h3>header <b>222</b></h3>text <b>2222</b><h3>header <b>3333</b></h3>text <b>33333333</b><h3>header <b>444444</b></h3>text <b>

То регулярка
PHP:
скопировать код в буфер обмена
  1.      $ret = preg_match_all('~<h3>(.+?)</h3>(.+?)(?=<h3>|$)~ium', $str, $matsches);

его не находит...
Как правильно?
 
 Top
andrewkard
Отправлено: 06 Июня, 2016 - 10:15:40
Post Id


Участник


Покинул форум
Сообщений всего: 1041
Дата рег-ции: Нояб. 2014  


Помог: 19 раз(а)




mstdmstd пишет:
И еще вопрос а нет ли в онлайне аналога jfiddle-а для регулярных выражений ?

Есть, вот например https://regex101[dot]com/
 
 Top
mstdmstd
Отправлено: 15 Июня, 2017 - 14:56:58
Post Id


Гость


Покинул форум
Сообщений всего: 101
Дата рег-ции: Авг. 2014  


Помог: 0 раз(а)




Мелкий пишет:
Верно. Вам нужны опережающие проверки:
~<h3>(.+?)</h3>(.+?)(?=<h3>|$)~

Альтернатива "или конец строки" нужна для обработки последнего вхождения.
Мелкий пишет:
Верно. Вам нужны опережающие проверки:
~<h3>(.+?)</h3>(.+?)(?=<h3>|$)~

Альтернатива "или конец строки" нужна для обработки последнего вхождения.

Вернулся к этому примеру : он работает но для меня не понятно как Не понял
Непонятна как раз часть

Я читаю про опережающие проверки - но это не очень укладывается в голове применительно к этому примеру...
Если можно, разжуйте плиз...
 
 Top
Мелкий Супермодератор
Отправлено: 15 Июня, 2017 - 17:39:15
Post Id



Активный участник


Покинул форум
Сообщений всего: 11590
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 564 раз(а)




Смотрите книгу "Регулярные выражения" Джеффри Фриддла. У него отлично описана механика конечного автомата регулярок.

Вкратце - совпадение опережающей проверки не входит в сам совпадающий фрагмент. Поэтому <h3> не попадает в предыдущий искомый фрагмент и позволяет внятно найти следующий фрагмент без пропуска.
Или конец строки необходим для поиска последнего вхождения, ведь после него следующего <h3> уже нет.


-----
PostgreSQL DBA
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 1 (гостей: 1, зарегистрированных: 0)
« Регулярные выражения »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB