2016-06-22 7 views
-1

У меня есть следующий текст, и я пытаюсь избавиться от \'. Требуемый вывод: "Gigi DAgostino".Замена обратной косой черты с использованием preg_replace

"Gigi D\'Agostino" 

Я проверил несколько других вопросов, касающихся замены с обратной косой черты preg_replace, и узнал, что мне нужно удвоить денешься. Поэтому я провел несколько экспериментов.

echo preg_replace("/\\\/", "", "Gigi D\'Agostino"); // Gigi D'Agostino 
echo preg_replace("/'/",  "", "Gigi D\'Agostino"); // Gigi D\Agostino 
echo preg_replace("/\\\\'/", "", "Gigi D\'Agostino"); // Gigi DAgostino 

Пока что так хорошо. Это имеет смысл. Но в моем фактическом коде я использовал одинарные кавычки для шаблонов.

echo preg_replace('/\\\/', "", "Gigi D\'Agostino"); // Gigi D'Agostino 
echo preg_replace('/\'/',  "", "Gigi D\'Agostino"); // Gigi D\Agostino 
echo preg_replace('/\\\\\'/', "", "Gigi D\'Agostino"); // Gigi DAgostino 

Опять же, первые два имеют смысл. У меня нет третьего. Зачем нужна дополнительная косая черта?

'/ (\\)->\  (\)->' /' 
    ^   ^
     |    | 
    these two  this one 
    escape the  escapes 
    next \   the following ' 

Какова роль заемного (5 го) \?

Я не очень хорошо знаком с регулярным выражением, поэтому мне может быть что-то очень простое здесь.

PS: Я не ищу способ заменить обратную косую черту. Вышеприведенные примеры уже делают это. Я пытаюсь понять, как это происходит.


$str = "Gigi D\'Agostino"; 

# \ escapes ' 
echo preg_replace('/\'/', "", $str) . PHP_EOL; # "Gigi D\Agostino" 

# can't escape \ with a single \. it requires two \ 
echo preg_replace('/\\/', "", $str) . PHP_EOL; # No ending delimiter '/' found 

# \\ escapes the third \ 
echo preg_replace('/\\\/', "", $str) . PHP_EOL; # "Gigi D'Agostino" 

# now we combine the patterns. we replace \' 
# we need to escape both \ and ' 
# double backslashes to escape \, and a single backslash to escape ' 
# makes four backslashes and an apos: \\\ \' 
# but ofc, this doesn't work. requires an additional \ 
echo preg_replace('/\\\\\'/', "", $str) . PHP_EOL; # "Gigi DAgostino" 
+0

Любые причины не использовать http://php.net/manual/en/function.stripslashes.php? – chris85

+0

В одинарных кавычках обратная косая черта * ускользает от себя * и одинарной кавычки. PCRE просто нуждается в скрытой обратной косой чертой. Просто «распечатайте» свои строки, чтобы увидеть, в каких фактических значениях строк они были маркированы. – mario

+0

@ chris85 Я также снимаю/заменяю другие символы, которые хранятся в 2D-массиве [pattern, substitute]. Кроме того, мне нравится разобраться. – akinuri

ответ

0

Вы можете использовать str_replace() функция

echo str_replace("\'","","Gigi D\'Agostino") 
0

Если запуск с одной цитируемыми разделителями шаблоном такого как '/'/' (без отводящего ничего), вы заметите, разделитель / находится за пределами одиночного кавычки, что вызывает ошибку. Сбегая от ', используя \, разделитель возвращается в одиночный кавычек и одиночная кавычка экранируется. Если вы продолжите этот процесс с использованием шаблона \', он должен стать очевидным, что происходит, а также заметить шаблон внутри этого процесса.

 '/'/' - error:/delimiter outside of pattern 
    '/\'/' - escape ' 
    '/\\'/' - escape \, unescape ', error:/delimiter outside of pattern 
    '/\\\'/' - escape ', unescape \ 
'/\\\\'/' - escape \, unescape ', error:/delimiter outside of pettern 
'/\\\\\'/' - escape ', escape \ 

Если вы продолжали и добавили еще один \ к образцу угадать, что произойдет? yep, разделитель за пределами шаблона ... надеюсь, что это проливает немного света на то, что происходит.

+0

Извините за поздний ответ, но я до сих пор не могу обмотать его вокруг. Выполнение эксперимента путем добавления/удаления «\» к шаблону просто даст мне конечный результат. Меня это не интересует. Я хочу знать об ускорении процесса. См. Обновление. Надеюсь, это достаточно ясно, чтобы показать, откуда моя путаница. – akinuri

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