Мистика с preg_replace, кто-нибудь сталкивался с таким?

mars37

Новичок
Мистика с preg_replace, кто-нибудь сталкивался с таким?

Есть давно использующийся код, с помощью которого из некоторой строки (шаблона страницы) удаляются оставшиеся (необработанные) конструкции типа "{if:NAME}...{/if:NAME}". Вот этот код:

$content = preg_replace("/\{if\:(.*?)\}.*?\{\/if\:\\1\}/is", "", $content);

И вдруг пару дней назад попадается текст, для которого это выражение ничего не возвращает. Вернее gettype($content) возвращает "NULL".
Текст обычный, символы латинские, никаких особенностей в нём нет. Этот эффект наблюдался c PHP 5.2.0 и с PHP 5.2.4.

Кто нибудь сталкивался с подобным? Как это побороть?


Для "чистоты" эксперимента этот "проблемный" текст выделен в отдельный файл 1.html и эффект проверялся таким скриптом:
PHP:
<?
$content = file_get_contents('1.html');
$s = preg_replace("/\{if\:(.*?)\}.*?\{\/if\:\\1\}/is", '*******', $content);
echo htmlspecialchars($s);
?>
"Проблемный" текст соответствует следующему регулярному выражению:
/[^a-z0-9*#=\/"\'\(\)\:<>\$\!\?,\.&_\-\{\};+@%\|\t\n\r\S\s]{1,}/is
Т.е. никаких особых, ранее не использовавшихся символов нет. (Не ругайте за избыточность: \t\n\r\S\s)...

Когда из текста удалялись все пробелы, preg_replace начинал работать! Если заменять пробелы на что-нибудь, то не работает.
Мистика какая-то...
 

ustas

Элекомист №1
Для "чистоты" эксперимента хотелось бы увидеть файл 1.html
 

mars37

Новичок
$content = '{if:true}bla-bla-bla{/if:true }';
В этом случае, поскольку совпадения с шаблоном нет, регулярка возвратит то, что ожидалось, исходный текст: '{if:true}bla-bla-bla{/if:true }'
Тут всё нормально. И тип ответа будет 'string'.
В моём-же случае тип "результата" - 'NULL'

Для "чистоты" эксперимента хотелось бы увидеть файл 1.html
Я бы привёл, но там конфиденциальные данные, переписка...

-~{}~ 02.10.07 13:25:

"Проблемный" текст соответствует следующему регулярному выражению:
/[^a-z0-9*#=\/"\'\(\)\:<>\$\!\?,\.&_\-\{\};+@%\|\t\n\r\S\s]{1,}/is
Здесь я конечно допустил опечатку, в начале нет отрицания ^
 

Mr_Max

Первый класс. Зимние каникулы ^_^
Команда форума
mars37
Определитесь
или
Для "чистоты" эксперимента этот "проблемный" текст выделен в отдельный файл 1.html
или

Для "чистоты" эксперимента хотелось бы увидеть файл 1.html
Я бы привёл, но там конфиденциальные данные, переписка...
и решаете свои проблемы сам.
Договорились?

-~{}~ 02.10.07 11:02:

А лапшу вешать всему форуму нехорошо. Самого файла скореее всего ввобще нет и никогда не было.
 

SiMM

Новичок
> В моём-же случае тип "результата" - 'NULL'
[m]preg_replace[/m] не возвращает NULL.
 

mars37

Новичок
Mr_Max, файл есть, Ваше утверждение
А лапшу вешать всему форуму нехорошо. Самого файла скореее всего ввобще нет и никогда не было.
безосновательно.

Проблема в чём? Это выражение
preg_replace("/\{if\:(.*?)\}.*?\{\/if\:\\1\}/is", '', $content);
для ЛЮБОГО $content, (в котором обычные латинские и некоторые спец-символы) должно возвращать строку или вызывать ошибку, как бывает, если например в регулярном выражении указать недопустимый модификатор.
И вдруг попадается строка, самая обычная с виду, для которой это выражение не возвращает ничего. Без всякой ошибки. И скрипт выполняется дальше. Т.е. если сделать так:
PHP:
<? 
$content = file_get_contents('1.html'); 
$s = preg_replace("/\{if\:(.*?)\}.*?\{\/if\:\\1\}/is", '*******', $content); 
echo htmlspecialchars($s); 
echo 'Ok';
?>
То 'Ok' появляется.
 

Mr_Max

Первый класс. Зимние каникулы ^_^
Команда форума
И вдруг попадается строка, самая обычная с виду, для которой это выражение не возвращает ничего. Без всякой ошибки. И скрипт выполняется дальше.
Ну и где эта "самая обычная с виду строка"?
Или нам додумать самостоятельно?
 

mars37

Новичок
preg_replace не возвращает NULL.
Вот именно!
А у меня после
PHP:
$s = preg_replace("/\{if\:(.*?)\}.*?\{\/if\:\\1\}/is", '*******', $content); 
echo gettype($s);
получается 'NULL'
Т.е. preg_replace не возвратил ничего, даже пустую строку.
 

mars37

Новичок
Ну и где эта "самая обычная с виду строка"?
Или нам додумать самостоятельно?
В этой строке конфиденциальные данные, привести её не могу. Её размер около 200 КБ. Придумать-же другую строку, для которой повторяется такой эффект тоже не могу.

В каких случаях, когда, preg_replace может себя так вести? Или это какой-то баг PHP? Кто-нибудь сталкивался с подобным?
 

Mr_Max

Первый класс. Зимние каникулы ^_^
Команда форума
mars37
Ну так составьте сроку без Вашых секретных данных.
Поймите-же наконец, без Вашей помощи Вам вряд-ли кто-либо сможет помочь.
 

mars37

Новичок
А кавычки прослешить?
Где именно?
Повторюсь: код с этой регуляркой работает без проблем уже давно, при мне - 6 месяцев, до меня говорят, что работал уже 4 года.
 

Mr_Max

Первый класс. Зимние каникулы ^_^
Команда форума
GeT
Эта строка ничего не может возвращать.
Пример высосан из пальца.
 

Mr_Max

Первый класс. Зимние каникулы ^_^
Команда форума
mars37
Что-то Вы совсем уж запутались.
Уже совсем не помните, что писали несколькими постами выше...
Этот код процитирован из Вашего сообщения

Вот именно!
А у меня после

$s = preg_replace("/\{if\<img src="images/smilies/frown.gif" border="0" alt="">.*?)\}.*?\{\/if\:\\1\}/is", '*******', $content);
echo gettype($s);

получается 'NULL'
Т.е. preg_replace не возвратил ничего, даже пустую строку.
Который
высосан из пальца
Поэтому
самостоятельно.
PHP FAQ: Ничего не работает! Что делать???
PHP FAQ: Регулярные выражения.
[m]preg_replace[/m]
 

mars37

Новичок
Автор оригинала: Mr_Max
mars37
Ну так составьте сроку без Вашых секретных данных.
Поймите-же наконец, без Вашей помощи Вам вряд-ли кто-либо сможет помочь.
Как только получится так урезать строку, чтобы и данные были "незакрытые" и "глюк" сохранялся, - обязательно покажу.
А вот Ваш тон мне не нравится. Хоть-бы извинился за "вешать лапшу" ;)
 

Mr_Max

Первый класс. Зимние каникулы ^_^
Команда форума
Лично я не вижу желания помочь самому себе
 

mars37

Новичок
Mr_Max
Блин, это я регулярку скопировал из другого места... Имелось ввиду конечно-же
"/\{if\:(.*?)\}.*?\{\/if\:\\1\}/is"
А... Это код смайлика вписался сюда. Вот это: ":-( " из регулярки сайтом отобразилось как смайлик, потом я сделал "редактировать", поставил "отключть смайлики", и вот результат...
 
Сверху