Задание: Если переменная $text не содержит специальных символов - вывести соответствующее сообщение . Никак не получается заставить программу учитывать обратный слэш, хоть с экранированием, хоть без:
$pattern = '/[~!@#$%^&*()+`\'";:<>\/\\|]/';
$text = 'ab\c';
if (!(preg_match($pattern, $text))){
echo "Great! Special symbols was not found!"; }
В данном случае - программа все равно выводит заданное сообщение
В строковых литералах с двойными и одиночными кавычками, а также Heredoc, надо использовать двойной знак обратной косой черты для обозначения символа \. Так как для экранирования метасимволов регулярных выражений нужны два таких символа, нужно использовать четыре знака \:
$pattern = '/[~!@#$%^&*()+`\'";:<>\/\\\\|]/';
^^^^
См. раздел Строки ("Одинарные кавычки"):
Если необходимо написать сам обратный слеш, продублируйте его (\\)
Далее в разделе "Двойные кавычки" написано
\\ обратная косая черта
Если же объявить шаблон в строковом литерале типа Nowdoc, дополнительного экранирования \ можно избежать:
$pattern = <<<'EOT'
/[~!@#$%^&*()+`'";:<>\/\\|]/
EOT;
$text = 'ab\c';
echo "$text\n";
if (!(preg_match($pattern, $text))){
echo "Great! Special symbols was not found!";
}
См. демо онлайн.
Вариант имеется без запары с экранированием (ну только одну \' в данном случае). Скорость с регуляркой не сравнивал
$pattern = '[~!@#$%^&*()+`\'";:<>/\|]';
$text = 'ab\c';
if ( str_replace(str_split($pattern), '', $text)==$text ){
echo "Great! Special symbols was not found!"; }
Если запрещенные символы только однобайтовые - все проще:
$bad_chars = '[~!@#$%^&*()+`\'";:<>/\\|]';
$text = 'ab\\c';
if (($bad_start = strpbrk($text, $bad_chars)) === false) {
echo "Great! Special symbols was not found!";
} else {
echo "Error! Found special symbol `{$bad_start[0]}`";
}
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости