От автора: вчера вышел утром поздороваться с соседом. Слово за слово, потом разговор перешел на повышенные тона и «спецсимволы» (из трех пальцев и меньше), а потом нас жены еле разняли. Хорошо, что PHP спецсимволы намного безопаснее!
Экранирование и специальные символы
Спецсимволы и программирование – вещи неразделимые! Хочешь или не хочешь, все равно «напорешься» на них. Чаще всего разработчики «спотыкаются» об кавычки (двойные и одинарные), которые используются для отделения значений типа srting. То есть сначала идет объявление переменной, а затем ей присваивается какое-то строковое значение. Например:
1 2 3 4 |
<?php $str="Какое-то строковое значение"; echo $str; ?> |
Из этого простого примера становится ясно, что с PHP экранированием спецсимволов вы все равно рано или поздно встретитесь. Почему? Потому что этот язык используется для создания динамических ресурсов.
С помощью PHP страницы сайтов собираются на стороне сервера после их запроса со стороны клиентского приложения (браузера). А, как нам известно, структура любого интернет-ресурса размечается с помощью HTML. В том числе с его помощью задается форматирование текстового контента, в котором кавычки используются повсеместно.
Еще один пример
Давайте попытаемся разобрать все сказанное выше на каком-нибудь примере. С помощью кавычек в русском языке выделяются и прямая речь, и существительные с собственными именами, и другие структуры.
Например, нам нужно вывести в кавычках названия кораблей (ну, тех, которые сразу «и человек, и пароход»). Вот здесь нам и понадобится PHP экранирование спецсимволов:
1 2 3 4 |
<?php $cheloveki-parohodi=""Крузерштерн", "Остап Бендер","Рога и копыта","Винни-Пух","Крокодил Гена""; echo $cheloveki-parohodi; ?> |
Вроде бы все правильно сделали: экранировали значение строки согласно синтаксису PHP, и название «пароходочеловеков» (по правилам русского языка) обернули в кавычки. Вот только в ответ мы получим на экране не текст, а сообщение о допущенной синтаксической ошибке.
Чтобы вы не мучились, сразу покажу, как работать тоже не будет.
Конечно, можно удалить спецсимволы в коде PHP, но тогда проявитесь среди пользователей, которые будут читать ваш контент, как безграмотные. Так что нужно экранировать спецсимволы другими спецсимволами :). Вот так:
1 2 3 4 5 |
<?php echo "\"Крузерштерн\", \"Остап Бендер\",\"Рога икопыта\", \"Винни-Пух\",\"Крокодил Гена\""; ?> |
Еще несколько нужных примеров
Немного «перефразируем» наш основной пример. Мы помним, что PHP тесно связан с MySQL. А в этой СУБД апостроф ну никак не хочет записываться в БД. Он игнорируется интерпретатором. Этот знак чаще всего используется при написании иностранных (англоязычных) фамилий или в украинском языке. Например, O’Connell. Чтобы не проставлять слеши собственноручно, экранирование можно доверить функции addslashes().
Теперь выясним, как в PHP осуществить замену спецсимволов. Для этого мы применим строковую функцию str_replace(). В качестве аргументов она принимает три значения: исходную строку, какой символ менять и на что. Пример:
1 2 3 4 |
<?php $inozemec="Привет всем 'инопланетянам' от землян"; echo str_replace("'","\"",$inozemec); ?> |
Также с помощью данной функции можно убрать спецсимволы PHP, заменив их на обычный пробел. Вот еще один вариант решения проблемы, но теперь уже с помощью регулярных выражений:
1 2 3 4 5 |
<?php $inozemec="Привет всем 'инопланетянам' от землян"; $str = preg_replace('%[^A-Za-zА-Яа-я0-9]%', ' ', $inozemec); echo $str; ?> |
С помощью шаблона, указанного в функции preg_replace(), в PHP мы удалили спецсимволы из строки. Думаю, на сегодня регулярных выражений и спецсимволов достаточно. Я еще от вчерашних не отошел :).