Экранирование и регулярные выражения. PHP

130
16 мая 2019, 09:50

Задание: Если переменная $text не содержит специальных символов - вывести соответствующее сообщение . Никак не получается заставить программу учитывать обратный слэш, хоть с экранированием, хоть без:

$pattern = '/[~!@#$%^&*()+`\'";:<>\/\\|]/';
$text = 'ab\c';
if (!(preg_match($pattern, $text))){
    echo "Great! Special symbols was not found!";    }

В данном случае - программа все равно выводит заданное сообщение

Answer 1

В строковых литералах с двойными и одиночными кавычками, а также Heredoc, надо использовать двойной знак обратной косой черты для обозначения символа \. Так как для экранирования метасимволов регулярных выражений нужны два таких символа, нужно использовать четыре знака \:

$pattern = '/[~!@#$%^&*()+`\'";:<>\/\\\\|]/';
                                    ^^^^

См. раздел Строки ("Одинарные кавычки"):

Если необходимо написать сам обратный слеш, продублируйте его (\\)

Далее в разделе "Двойные кавычки" написано

\\    обратная косая черта

Если же объявить шаблон в строковом литерале типа Nowdoc, дополнительного экранирования \ можно избежать:

$pattern = <<<'EOT'
/[~!@#$%^&*()+`'";:<>\/\\|]/
EOT;
$text = 'ab\c';
echo "$text\n";
if (!(preg_match($pattern, $text))){
    echo "Great! Special symbols was not found!";    
}

См. демо онлайн.

Answer 2

Вариант имеется без запары с экранированием (ну только одну \' в данном случае). Скорость с регуляркой не сравнивал

$pattern = '[~!@#$%^&*()+`\'";:<>/\|]';
$text = 'ab\c';
if ( str_replace(str_split($pattern), '', $text)==$text ){
    echo "Great! Special symbols was not found!";    }
Answer 3

Если запрещенные символы только однобайтовые - все проще:

$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]}`";
}
READ ALSO
Как сделать зависимость от страны?

Как сделать зависимость от страны?

как сделать логику, выбираешь страну(таксономия = lftcat) и после него выводятся записи этой таксономии в другом селекте

121
Отображение на хостинге

Отображение на хостинге

При открытии файла html не через хостинг все выглядит таким образом (изображение 1) Но на хостинге все выглядит следующим образом (изображение...

165
Symfony 3.4 Overblog Graphql не могу понять как разобрать Query

Symfony 3.4 Overblog Graphql не могу понять как разобрать Query

Всем привет, поставил https://githubcom/overblog/GraphQLBundle на symgony 3

173
Вывести значение из MYSQL

Вывести значение из MYSQL

вот например чтобы вывести все значения из столбца MYSQL, у меня есть такой цикл:

186