preg_replace сжирает слэш

XiMiK

Новичок
preg_replace сжирает слэш

Проблемма со следующим кодом:
PHP:
$this->text = preg_replace("/(".preg_quote($start, "/").")(.*)(".preg_quote($end, "/").")/siU", $start.$new_block.$end, $this->text);
Хочу заменить текст между заданными строками $start и $end на $new_block. Строка успешно заменяется, но в ней стабильно (ну во всяком случае у меня на компе) с исчезает один слэш. Строка $new_block идёт скажем с двумя подряд слэшами, а перед возвратом слэш какбы расковычивается и остаётся один. Проверено, что $new_block до и после замены с двумя слэшами...

Скажите пожалуйса это нормально, или это чисто глюки ПХП?

Win2000
php-4.3.4 (cgi)
IIS
 

neko

tеam neko
сделай проверочный пример
без этих вложенных массивов
а то тут понять, кто кого сжирает, крайне затруднительно
 

SiMM

Новичок
Интересно, а зачем здесь вообще регулярники?
[m]strtolower[/m] + [m]strpos[/m] + [m]substr[/m] - и никаких preg_quote
 

neko

tеam neko
затем что с регулярками проще и короче
а с доморощеными оптимизаторами всего на свете получается много кода, и офигенный прирост скорости в 3 мс.
 

XiMiK

Новичок
Сделал это я действительно из удобства (кстати вполне оправданно), да и само по себе регулярное выражение совершенно правильное...

Проблема не в этом, был задан конкретный вопрос...
 

SiMM

Новичок
XiMiK, на конкретный вопрос neko тебе уже ответил - или тебе не знакомо слово "отладка" и ты считаешь, что тут все телепаты?
 

neko

tеam neko
Проблема не в этом, был задан конкретный вопрос...
и то верно
осталось найти добровольца который захочет в этом коде разбиратся даже не видя исходных данных
 

XiMiK

Новичок
Да исходные данные тут вобще роли не играют...

Я всё проверил и пришол к выводу, что это была приведённая строка.

из исходных данных сдесь только:
$start - Строка с каторой начинается смена текста
$end - Строка на каторой кончается смена текста
$new_block - Новый текст
$this->text - Строка над которой производится операция
 

XiMiK

Новичок
Замена происходит по простому принцепу:

берём из строки строку $start.<любой текст>.$end
Заменяем на $start.$new_block.$end

В результате всё заменяется, но в результатирующем тексте пропадает (расковычивается) слэш (\)
 

XiMiK

Новичок
SiMM
Большое спосибо за бесполезный ответ! Я ещё раз повторяю Я всё проверил (и на ini_set('display_errors',1);
error_reporting(E_ALL ^E_NOTICE);)), всё тихо, ни ошибки...

Я даже больше скажу - все переменные существуют и не вызывают сомнения!!! (кроме результата замены)

Если кто-то сомневается, то замена происходт (но с расковыченными слэшами), проверено.

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

И просьба, если будете посылать в мануал, напишите конкретно, что я упустил (я там всё облазил и если там и есть ответ, то мне его не найти).
 

StUV

Rotaredom
$this->text = preg_replace("/(".preg_quote($start, "/").")(.*)(".preg_quote($end, "/").")/siU", $start.$new_block.$end, $this->text);
значения всех агрументов прег_реплэйса для конкретного случая в котором "не работает" в студию, иначе ответа на свой вопрос не дождешься (если ты еще не догадался =)
 

XiMiK

Новичок
Хот кто для интереса предложилбы слэши удваивать перед заменой:
PHP:
$this->text = preg_replace("/(".preg_quote($start, "/").")(.*)(".preg_quote($end, "/").")/siU", $start.str_replace("\\" , "\\\\", $new_block).$end, $this->text);
Пока тока так, но понятно же, что если на другом хосте скрипт будет вести как мне кажется нормально, то лишние слэши будут только мешать...

Вижу не популярная эта тема...

А чё реально не у кого таких проблемм не вазникало?

-~{}~ 23.09.04 14:58:

Автор оригинала: StUV
значения всех агрументов прег_реплэйса для конкретного случая в котором "не работает" в студию, иначе ответа на свой вопрос не дождешься (если ты еще не догадался =)
Ты два слэша вводишь, а они расковычиваются, чего не понятно (остальной текст - хтмл страница...).
 

StUV

Rotaredom
Ты два слэша вводишь, а они расковычиваются, чего не понятно (остальной текст - хтмл страница...).
ну [&^$#$%#@]....
ты можешь из своего прега выкинуть несущественное и привести значения, на которых "не срабатывает" ?
или будешь продолжать всем мозги парить - "типа сами догадайтесь где там у меня чего есть в моих переменных - это же такая для всех привычная задача - если вы тут все такие крутые, то должны сразу догадаться" ???!!!

если тебе нужен флейм - то это у тебя хорошо получается
если хочешь получить ответ на вопрос - покажи значения (без своего "ненужного хтмля"
---------------------------------------
зы: ни[...] непонятно
 

SiMM

Новичок
Ха-ха-ха. Кажется, я понял в чём у него дело. Я же говорил, что регулярники здесь неуместны, ну да ладно. Кароче, Склифосовский, беги читать мануал по [m]preg_replace[/m], особенно осознай смысл второго параметра и то, как его интерпретирует PHP (мне сразу не понравилось, как он его формирует - нафига тогда, спрашивается, нужны были всякие группирующие скобки в регулярнике?). Ничего общего с интерпретацией второго параметра функции [m]str_replace[/m], прошу заметить, там нет.
 

XiMiK

Новичок
SiMM

Спосибо, я кажется, с твоей помощью понял в чём проблемма. Да, дело всё же наверное в этих ссылках, но цифр после слешей я не ставил, а исчезает всё равно. Как откльчить проверку ссылок я там не нашёл. И как я понял метод удвоения слешей всётаки - реальное решение проблеммы, остаётся только убедится, что надёжное. А скобки мне действительно нужны (они как чась логики прогр.).

Если нельзя отключить обработку ссылок, то как можно гарантировано обойти её внешними методами?

StUV

ХТМЛ страница - я имел в виду любую страницу, какторая может содержать в себе всё, что угодно!
привести значения, на которых "не срабатывает" ?
Не срабатывает что? Всё работает, но неправельно, тачнее не так как мне надо. Я хотел сказать, что если в редактируемом тексте doubleslash, то он расковычивается перед подменой.

Мне не нужен флейм, просто у мея проблемма. А повторять одно и тоже мне приходится потому-что ты задаёшь один и тотже вопрос, толком не вникнув в тему.

--
По всей видимости вопрос был действительно сложный...
 

SiMM

Новичок
Автор оригинала: XiMiK
Как откльчить проверку ссылок я там не нашёл. И как я понял метод удвоения слешей всётаки - реальное решение проблеммы, остаётся только убедится, что надёжное.
Это "костыль", а не решение проблемы, имхо - помимо слешей есть ещё как минимум "баксы" ;) И потом, я не знаю, из чего у тебя состоят $start и $end - но их вообще-то тоже надо обрабатывать
А скобки мне действительно нужны (они как чась логики прогр.).
Так и используй их по назначению, а не так, как там у тебя.
PHP:
$this->text = preg_replace('/('.preg_quote($start, '/').')(.*)('.preg_quote($end, '/').')/siU', '$1'.preg_quote($new_block).'$3', $this->text);
Мне не нужен флейм, просто у мея проблемма. А повторять одно и тоже мне приходится потому-что ты задаёшь один и тотже вопрос, толком не вникнув в тему.
Ему приходится повторять свой вопрос, потому что ты вместо конкретного примера вида
PHP:
$text = 'тест1 бла-бла-бла тест2';
$start = 'тест1';
$end = 'тест2';
$new_block = '\\';
echo preg_replace("/(".preg_quote($start, "/").")(.*)(".preg_quote($end, "/").")/siU", $start.$new_block.$end, $text);
подсовывал какой-то гипотетический кусок кода без указания примера, когда он не работает.
По всей видимости вопрос был действительно сложный...
На самом деле вопрос был на внимательность ;)
 

XiMiK

Новичок
Автор оригинала: SiMM
Это "костыль", а не решение проблемы...
А на костылях как известно далеко не убежишь :(


из чего у тебя состоят $start и $end
Там таже проблемма (это коментарии - разделители)...

... их вообще-то тоже надо обрабатывать
Был бы рад, но чем? Особенно если взять в учёт, что там ещё баксы... Так неужели preg_replace такая лажа (это эмоции). Может мне чё другое надо?


Так и используй их по назначению...
Я рег скопировал из preg_match`a, который отдаливал для реплейса блоки, а скобки оставил для соответствия. Но проблема-то не в этом (ну если в этом так и скажи!). По моему скобки там вобщем не мешаются.

На счёт кода, сори:
$text = ' бла-бла-бла тест1 бла-бла-бла тест2 бла-бла-бла ';
$start = 'тест1';
$end = 'тест2';
$new_block = ' б\{$2}\\\л\$а-бл\\а-бла';
где бла-бла-бла - это любой текст с любой расстоновкой символов.
Задача: сделать $text такой -
' бла-бла-бла тест1 б\{$2}\\\л\$а-бл\\а-бла тест2 бла-бла-бла ';

На самом деле вопрос был на внимательность
С ошибкой теперь понятно (она моя и закл. в подходе), но теперь что делать, писать функцию, которая исключила бы данную проблемму?
 
Сверху