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

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

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

 

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

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

тема: Как работает preg_match_all ?
 
 автор: Владимир55   (26.03.2007 в 17:00)   письмо автору
 
 

В Самоучителе сказано:

"Ищет в строке subject все совпадения с шаблоном pattern и помещает результат в массив matches в порядке, определяемом комбинацией флагов flags."

Я этого не понимаю. Что конкретно является результатом?

Допустим, строка содержит:

123ждлдлддл123ддждлжд123жджд123дждд 123жд123олд

А шаблоном является 123. Какой массив сформируется в результате работы?
(флаги указывать не будем).

========
Попытка протестировать выражение средствами, указанные в Самоучителе, не дала ничего - просто белый экран:


$test = "123ждлдлддл123ддждлжд123жджд123дждд 123жд123олд" ;
$pattern = "123";
preg_match_all($pattern, $test, $out);
  
foreach ($out as $adr)
{
    echo $adr;
    echo "<br>";
}
echo ("</ul>");

   
 
 автор: ddhvvn   (26.03.2007 в 18:16)   письмо автору
 
   для: Владимир55   (26.03.2007 в 17:00)
 

>Попытка протестировать выражение средствами, указанные в Самоучителе, не дала ничего - просто белый экран:

возможно, Вы допустили ошибку или что-то "не то" с Вашим PHP, приведите Ваш код

   
 
 автор: Владимир55   (26.03.2007 в 18:31)   письмо автору
 
   для: ddhvvn   (26.03.2007 в 18:16)
 

Собственно, приведенный код и является моим кодом.

Но дело не только в нем: я не понимаю сути действия этого регулярного выражения. Вот в учебнике написано:

"Ищет в строке subject все совпадения с шаблоном pattern и помещает результат в массив matches в порядке, определяемом комбинацией флагов flags."

А какие это результаты? Вот нашлось первое совпадение - и что? Само совпадение помещают в matches? Допустим. А с несовпавшими элементами что? Их игнорируют? Или тоже помещают в массив?

Допустим, строка содержит:

$test = "123ждлдлддл123ддждлжд123жджд123дждд 123жд123олд" ;

А шаблоном является $pattern = "123";

Какой массив сформируется в результате работы?

   
 
 автор: SHAman   (26.03.2007 в 18:38)   письмо автору
 
   для: Владимир55   (26.03.2007 в 18:31)
 

Массив будет содержать шесть элементов, все из которых равны '123'.

Дело в том, что шаблон может быть сложным, скажем, шаблон

/.{3}/
будет соответствовать строкам
ааа
ббб
111

То есть - три одинаковых символа, идущих подряд. И если мы разберем строку
"Уииии! Как веееселооо!!!"
В результате мы получим массив из элементов:

иии
еее
ооо
!!!

   
 
 автор: Владимир55   (26.03.2007 в 18:53)   письмо автору
 
   для: SHAman   (26.03.2007 в 18:38)
 

Понятно, спасибо! Похоже, что я вкладывал в него не тот смысл...

Интересно, а можно ли получить массив НЕ совпадающих с шаблоном значений?

   
 
 автор: SHAman   (26.03.2007 в 19:05)   письмо автору
 
   для: Владимир55   (26.03.2007 в 18:53)
 

Можно.
Если вы хотите найти "все, что не", то нужно использовать шаблон типа:

/[^14]/

Под такой шаблон подходит что угодно, кроме единицы и четверки.

Если же вы хотите разделить строку по шаблону, то используйте preg_split.

   
 
 автор: Владимир55   (26.03.2007 в 19:19)   письмо автору
 
   для: SHAman   (26.03.2007 в 19:05)
 

На самом деле мне нужно найти все, что будет идти после "slovo1/slovo2/". Причем слеши имеют место быть и они значимы. Таких участков в тексте множество, и нужна информация по каждому из них.

Вот как это сделать?

   
 
 автор: SHAman   (26.03.2007 в 19:24)   письмо автору
 
   для: Владимир55   (26.03.2007 в 19:19)
 

Приведите кусок текста, где идет просто текст, ваши slovo1/slovo2/ другой текст, потом еще slovo1/slovo2.

То есть, дайте посмотреть какой текст и что конкретно вам из него нужно вытащить. Фраза "мне нужно найти все, что будет идти после", вероятно, не верна. Потому что: мы находим один раз искомый шаблон, а все, что идет за ним и будет этим "все, что после". Так что нужно ограничивать еще и конец поиска.

   
 
 автор: Владимир55   (26.03.2007 в 19:52)   письмо автору
 
   для: SHAman   (26.03.2007 в 19:24)
 

Вот такой длинный-длинный текст из похожих строк:


$text = '<font size="2">К. Бре. &nbsp Часть 1</font></a></p><p align="left"> <a href="http://site.ru/zalsf/sf01/sf01-2.htm">
<font size="2">К. Бре. &nbsp Часть 2</font></a></p><p align="left"> <a href="http://site.ru/zalsf/sf01/sf01-3.htm">
<font size="2">К. Бре. &nbsp Часть 3</font></a></p><p align="left"> <a href="http://site.ru/zalsf/sf01/sf01-4.htm">' ;


А я хочу превратить его в массив записей типа:
sf01/sf01-2.htm
sf01/sf01-3.htm
sf01/sf01-4.htm

И в дальнейшем этот массив я буду обрабатывать в цикле foreach, поочередно извлекая каждый из элементов массива и осуществляя с ним нужные действия.

==============
Желательно зацепиться в качестве образца за ru/zalsf/, ибо решение
http://www.softtime.ru/forum/read.php?id_forum=6&id_theme=34923&page=1 , предложенное cheops, работает на тесте из нескольких строк, но сбивается на длинном файле.

   
 
 автор: SHAman   (26.03.2007 в 20:15)   письмо автору
 
   для: Владимир55   (26.03.2007 в 19:52)
 

$pattern = "|<a href=\"?(http:\/\/(www)?)?(.*?)\"?|"; 

Искомые вами строки должны оказаться в переменной $3. Однако, я не проверял - времени нету. Проверьте сами, если не сработает - скажите. Да! Обязательно укажите квантификаторы m и i.

$pattern = "|<a href=\"?(http:\/\/(www)?)?(.*?)\"?|im"; 

   
Rambler's Top100
вверх

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