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


Автор: mikla 1.11.2007, 23:43
дело вот в чем. нужно заменить в строке все что находиться между тегами [loop] [/loop]

1. этот код
Код

$text = <<<EER
[loop] some ttext  :
some text[/loop] 
EER;
$new_text = preg_replace("/\[loop\](.*)\[\/loop\]/i"," new text ",$text);
echo $new_text;


выведет мне 

Код

[loop] some ttext : some text[/loop]


2. а этот код отработает нормально
Код

$text = "[loop] some ttext  :some text[/loop]";
$new_text = preg_replace("/\[loop\](.*)\[\/loop\]/i"," new text ",$text);
echo $new_text;


и выведет 

Код

new text


1. почему так происходит ? 
2. как сделать так чтобы preg_replace "съел" строку, к-рая задана в 1м примере ? 

Автор: Fally 2.11.2007, 01:02
Цитата(mikla @  1.11.2007,  23:43 Найти цитируемый пост)
$text = <<<EER
[loop] some ttext  :
some text[/loop] 
EER;
$new_text = preg_replace("/\[loop\](.*)\[\/loop\]/i"," new text ",$text);
echo $new_text;

Про модификатор s забыли, чтобы таких глюков не было, рассматривайте строку в однострочном режиме, т.е. рега такая:
Код

$new_text = preg_replace("/\[loop\](.*)\[\/loop\]/is"," new text ",$text);

Автор: mikla 2.11.2007, 08:03
Fally, Спасибо большое. 

Автор: mikla 2.11.2007, 20:03
еще одна проблема с регуляркой. нужно опять же взять то что между тегами [loop] [/loop] и сложить в массив.
делаю так 
Код

$textDR = "[loop] Text [/loop] [loop] Text [/loop]";
$split_arr = preg_split('/\[loop\](.*)\[\/loop\]/is',$textDR);
print_r($split_arr);        


вижу 
Код

Array
(
    [0] => 
    [1] => 
)


что я опять не так делаю ?

Автор: webevt 2.11.2007, 22:16
mikla, 

Код

$textDR = "[loop] Text [/loop] [loop] Text [/loop]";
$split_arr = preg_split('/\[loop\](.*?)\[\/loop\]/is',$textDR);
print_r($split_arr); 

Вопросик после * поставить нужно

Автор: mikla 2.11.2007, 22:23
webevt хм. у меня не работает ваш вариант. 

я сделал вот так : 

Код

preg_match_all('/\[loop\](.*)\[\/loop\]/isU',$textDR,$split_arr)


ну и получается что в $split_arr[0][i]лежить все что надо smile

Автор: flashaa 5.11.2007, 12:17
При работе с preg_split в регулярке задается именно разделитель массива, а в начале темки туда помещали выражения для элемента.. Да ещё с маской, которая тут никак не обрабатывается.
Через preg_split тоже можно вот так вот:
Код

preg_split(/\[loop\]|\[\/loop\]/, $string)

Только минус будет в том, что в массив совпадений попадут фрагменты строки перед первым [loop] и после последнего [/loop], т.е. 2 лишних эл-та. А вообще это кривое решение, preg_match_all в предыдущем сообщение - самое верное.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)