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

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

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

 

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

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

тема: Бесконечный цикл с preg_match
 
 автор: ZAHTET   (04.06.2007 в 14:07)   письмо автору
 
 

В общем задачка такая
дается строка вида
[item]text1[/text]
[item]text2[/text]
[item]text3[/text]
или так [item]text1[/text][item]text2[/text][item]text3[/text]

отсюда нужно вытащить все что между [item] и [/item] то есть tex1,text2,text3 и загнать их в массив

я сделал это так


$str = (string)$str;  //строка
            $items = array();  //массив в который потом попадут тексты
            while(preg_match("#\n?\[item\](.+?)\[\/item\]\n?#",$str,$code)) {
                $items[] = $code[1];
            }


но в результате я получаю бесконечный цикл!подскажаите что тут не то

   
 
 автор: sms-send   (04.06.2007 в 14:14)   письмо автору
 
   для: ZAHTET   (04.06.2007 в 14:07)
 

Функция preg_match возвращает количество совпадений шаблона: либо 0 (совпадений нет), либо 1 (совпадение найдено) и на этом останавливается. Т.к. вы поставили её в условие цикла и исходная строка не изменяется, то она постоянно возвращает (int) 1, что эквивалентно (bool) true, образуя бесконечный цикл. preg_match не изменяет исходную строку, т.е и в первый, и во второй, и в третий проход она будет проврять одну и ту же строку, находить одно и то же совпадение.

----------
Вы определитесь, в примере тег [item] закрывается тегом [/text], а в решении проверяется на закрывающий тег [/item].

Вот возможное решение:
<?php

$str
='[item]text1[/text][item]text2[/text][item]text3[/text]';
$str=(string)$str;  //строка
preg_match_all('#\[item\](.+?)\[/text\](?:\n)?#',$str,$code); #
$items=$code[1];

?>


P.S.: preg_match_all, в отличии от preg_match, проходит сразу по всем совпадениям.

   
 
 автор: ZAHTET   (04.06.2007 в 14:41)   письмо автору
 
   для: sms-send   (04.06.2007 в 14:14)
 

Спасибо огромное,у меня все заработало,на буджующее учту что есть такая функция preg_match_all)) Да там кстати вместо text в теге должно было быть item

P.S. Извиняюсь что вчера наехал в теме про задачу

   
Rambler's Top100
вверх

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