2015-01-21 3 views
2

У меня есть строка, которая выглядит как этотPHP preg_replace шаблон работает, если его неправильно?

../Clean_Smarty_Projekt/tpl/templates_c\. 
../Clean_Smarty_Projekt/tpl/templates_c\.. 

Я хочу, чтобы заменить ../, \. и \.. с regulare выражением.

Раньше я делал это так:

$result = str_replace(array("../","\..","\."),"",$str); 

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

Теперь я придумал этот шаблон

$result = preg_replace('/(\.\.\/)|(\\[\.]{1,2})/',"",$str); 

Что на самом деле возвращает только пустые строки ...

Причина: (\\[\.]{1,2})

В Regex101 его все ок. (Мне потребовалось пару минут, чтобы понять, что мне не нужен /g в preg_replace)

Если я использую этот шаблон в preg_replace, я должен сделать (\\\\[\.]{1,2}), чтобы заставить его работать. Но это явно неправильно, потому что я не искал двух косых черт.

Конечно, я знаю ускользающее русло (ускользающий слэш).

Почему этот матч не соответствует правильно?

+0

да, это тоже работает, но на самом деле даже 3 косые неправильно, потому что слэш экранируется и follwed символ не имеет никакого спасения .... 3 Slashes означает, что я побег '[ 'также. Похож на меня. – Dwza

+0

@Dwza с использованием 4 обратных косых черт, чтобы соответствовать одному обратному косую черту, не является «явно неправильным». Это на самом деле правильно. Когда парсер php получит 4 обратных слэша, он будет интерпретировать его как 2 обратную косую черту. Затем PHP передаст его в механизм регулярных выражений (2 обратных слэша), который интерпретируется как 1 обратная косая черта. Замечание: нет необходимости избегать точки в классе символов '[.]': Она теряет в себе значение регулярного выражения. – HamZa

+1

@HamZa phuu .. похоже на игру «Китайский шепот»: D thx для этого объяснения. – Dwza

ответ

2

Я предлагаю вам использовать другой разделитель php. В разделителе / вам нужно использовать три \\\ или четыре обратные косые черты \\\\ в соответствии с одной обратной косой чертой.

$string = '../Clean_Smarty_Projekt/tpl/templates_c\.'."\n".'../Clean_Smarty_Projekt/tpl/templates_c\..'; 
echo preg_replace('~\.\./|\\\.{1,2}~', '', $string) 

Выход:

Clean_Smarty_Projekt/tpl/templates_c 
Clean_Smarty_Projekt/tpl/templates_c 
+1

Вы любите' ~ 'те разделители не вы: D? (Я вижу это уже, когда вы меняете свое имя на: '~ Avinash Raj ~') – Rizier123

+0

этот шов для правильной работы сейчас. Большое спасибо ^^ Я думал, что должен установить точку в [], чтобы сделать работу {1,2} ... – Dwza

+0

Было бы лучше всего сгруппировать оба совпадения, исходя из того, что ваш '' 'неоднозначный, поэтому ваш шаблон заменит _ "../ .." _ как одно совпадение (_ ".." _ + '[/ \ /]' <- или применяется к одному символу, а затем _ ".. «_ литералы тоже). Это может быть проблемой в строке типа _ "foo .. \ ../ bar" _, где она не будет вести себя так, как ожидалось –

Смежные вопросы