От автора: регулярки – это «мутная» тема! Там и точка может оказаться не точкой, а метасимволом. Да и с остальными знаками тоже все в тумане. И чтобы «заглянуть» за эту дымку, нужно в PHP регулярные выражения экранирование применить.
Почему все «мутно»?
В синтаксисе шаблонов, созданных с помощью регулярок, используются метасимволы. Вот, например, обычная точка. Это знак препинания, который ставится в конце предложения. Вроде бы ничего необычного! Но это до тех пор, пока вы не начнете применять ее в регулярных выражениях. Совсем запутались? Ну, тогда поясню, что такое PHP экранирование и как с ним «бороться» на примере:
1 2 3 4 5 |
<?php $txt = "Точка - это не просто точка, а метасимвол. Это нужно знать."; $str = preg_replace("/./","!", $txt); echo $str; ?> |
Огласим задачу, которую должен выполнить приведенный выше пример. Есть строка, в которой нужно заменить все точки на восклицательный знак, чтобы повысить «интонацию» звучания всей фразы.
Для нахождения и замены по шаблону используем «традиционную» для регулярок функцию — preg_replace(). «Накатать» регулярное выражение тоже можно за пару секунд. При этом (на первый взгляд) можно обойтись без экранирования символов PHP. Но только на первый :).
Ух ты! А это что за частокол посреди поля? И кого это угораздило его «нагородить»? Нас и угораздило. И все потому, что не учли особенностей синтаксиса. Поглядим на шаблон поближе: /./
Вроде бы все правильно: нужно искать в тексте точку. Но в PHP точка – это не только знак препинания, но и метасимвол. Если правильно прочитать шаблон, то в нем указано, что нужно искать любой символ и заменить его на тот, который передан preg_replace() в качестве второго аргумента.
Вот тут и пригодится экранирование. С его помощью мы укажем интерпретатору языка, что следует искать именно точку. Таким же образом нужно экранировать слеши в PHP, поскольку они тоже являются специальными символами. Вот правильный вариант шаблона:
Другие варианты применения
Как видно из предыдущего примера, для экранирования используется обратная косая черта. Но она применяется не только в регулярках. Например, в PHP экранирование кавычек тоже востребовано. Особенно при использовании функций для вывода текста на экран:
1 2 3 4 |
<?php $str="Выделим \"слово\" двойными кавычками"; echo $str; ?> |
А вот как в PHP экранируются переменные:
1 2 3 4 5 |
<?php $a="\"слово\""; $str="Выделим $a двойными кавычками"; echo $str; ?> |
Или с помощью конкатенации строк, для которой используется точка:
1 2 3 4 5 |
<?php $a="\"слово\""; $str="Выделим ".$a."двойными кавычками"; echo $str; ?> |
Результат будет одинаковым (предыдущий снимок). Кстати, в этих примерах встречается PHP экранирование строки. Для этого используются двойные или одинарные кавычки.
Вот еще пример из этой же «оперы»:
1 2 3 4 5 6 |
<?php $str="Знак переноса на другую строку \\n - это он"; echo $str."<br />"; echo stripcslashes($str); ?> |
Здесь из PHP убираем экранирование с помощью функции stripcslashes().Теперь мы умеем не только добавлять слеши, но и удалять их. Думаю, туман немного рассеялся, и можно идти вперед. До следующей встречи в мире PHP!