2012-05-08 3 views
2

Хорошо, эта проблема, кажется, выше моей головы!

У меня есть этот код:

$request=preg_replace('$(^'.str_replace('$','\$',$webRoot).')$i','',$requestUri); 

Это бросает мне ошибку:

preg_replace(): Нет закрывающего ограничителя '$' найдено

Но вот в чем дело, что окончание делиметр конечно есть.

После этого вызова функции повторил я из следующих действий:

echo $webRoot; 
echo $requestUri; 
echo '$(^'.str_replace('$','\$',$webRoot).')$i'; 

Это результат тех эхо-сигналов:

/ 
/en/example/ 
$(^/)$i 

Что такое смешное, что если я сделаю это прямо:

preg_replace('$(^/)$i','',$requestUri); 

..it работает. Но это также не:

$tmp=str_replace('$','\$',$webRoot); 
preg_replace('$(^'.$tmp.')$i','',$requestUri); 

И только тщательное, я также испытал, что эхо $ TMP дает, и это дает правильное значение:

/ 

это ошибка в PHP в ОС Windows ? Я попробовал это на сервере Linux, и он работал, как ожидалось, и не выдавал эту ошибку. Или я чего-то не хватает?

Просто убедитесь, что я даже обновил PHP до последней версии Windows (5.4.2), и то же самое происходит.

+0

Есть ли причина, по которой вы используете метасимвол в качестве разделителя? –

+0

Получаете ли вы ту же ошибку при использовании другого разделителя, например '/' или '#'? – Quantastical

+0

Я изначально использовал/в качестве разделителя (вот почему у меня была str_replace, так как я имел дело с URL-адресом). Знак доллара был тем, что я использовал после попытки проб и ошибок для решения. – kingmaple

ответ

1

Ну, я лично использовал бы другой символ как разделитель, например '#', так как $ char является специальным символом регулярного выражения, который соответствует в конце строки, к которой применяется шаблон регулярного выражения. Тем не менее, несколько раз мне приходилось работать на серверах Windows, я обнаружил, что каждое регулярное выражение должно быть передано через функцию preg_quote, неважно, содержит ли оно или нет регулярные выражения специальных символов. Ответ

$request=preg_replace('#(^'.preg_quote($webRoot).')#i','',$requestUri); 
+0

По какой-то причине .. Bingo. По-видимому, Windows по какой-то причине не любит замену ручной разделительной строки. Но preg_quote работает. Это проблема, которая не относится к более старым версиям PHP, поскольку раньше у меня был код, запущенный в этой среде, но, видимо, это проблема. Ура! – kingmaple

0

abidibo является правильным, но, видимо, проблема была вызвана ошибкой в ​​str_replace() функцию. По какой-то причине, в Windows Apache и nginx, эта функция искажает строку и заполняет ее символами, которые невозможно прочитать.

+0

Возможно, вы правы, но я вполне уверен, что php + Windows требует preg_quote, даже если строка регулярного выражения не передается через str_replace, по крайней мере, это случилось с тем, что я разрабатывал php-инфраструктуру в среде WAMP, не могу вспомнить, какие 5 – abidibo

+0

Pardon (запись с мобильного), в заключение я не могу вспомнить, какая версия 5.x php я запускал. Ура! – abidibo

+0

На самом деле нет, это не так, я выполнил тот же тест на Uniform Server с последними PHP и Apache, и этого не произошло. Это str_replace(), но, похоже, только с nginx и PHP. Там что-то очень не так. Но ваш отзыв был хорош, так как это правильный способ избежать регулярного выражения. – kingmaple