Quotemeta: примеры (PHP)
quotemeta(string $string): stringОписание функции quotemeta
Функция quotemeta экранирует специальные символы в строке, добавляя перед ними обратную косую черту. Это полезно при работе с регулярными выражениями или когда необходимо использовать строку как литерал, содержащий метасимволы.
Функция применяется для безопасной вставки строк в шаблоны регулярных выражений, построения shell-команд или обработки текста, где определенные символы имеют специальное значение.
Функция принимает один обязательный параметр:
- string $str - строка, которая будет обработана.
Возвращает строку с экранированными метасимволами.
Базовые примеры использования
Код:
echo quotemeta('Hello.world');Результат:
Hello\.world
Код:
echo quotemeta('test*string+[example]');Результат:
test\*string\+\[example\]
Код:
echo '[' . quotemeta('') . ']';Результат:
[]
preg_quote() - экранирует символы для использования в регулярных выражениях. Позволяет указать дополнительный разделитель. Предпочтительнее для работы с PCRE.
addslashes() - экранирует кавычки и другие символы для безопасной вставки в SQL-строки. Используется для подготовки данных для баз данных.
htmlspecialchars() - преобразует специальные символы в HTML-сущности. Применяется для вывода данных в HTML.
Функция не экранирует все специальные символы, а только . \ + * ? [ ^ ] ( $ ).
Код:
echo quotemeta('test&example');Результат:
test&example
Повторное применение функции к уже экранированной строке:
Код:
$str = 'hello.world';
$escaped = quotemeta($str);
echo quotemeta($escaped);Результат:
hello\\.world
Функция quotemeta существует с ранних версий PHP и не претерпела значительных изменений. В PHP 8 функция работает стабильно без изменений синтаксиса или поведения.
Расширенные примеры
Экранирование пользовательского ввода для безопасного использования в preg_match:
$user_input = 'file.*.txt';
$pattern = '/^' . quotemeta($user_input) . '$/';
echo $pattern;
// Использование
if (preg_match($pattern, 'file.*.txt')) {
echo 'Совпадение найдено';
}Результат:
/^file\.\*\.txt$/
Создание безопасного шаблона для поиска файлов:
$filename = 'report[2023].pdf';
$safe_pattern = quotemeta($filename);
echo $safe_pattern;Результат:
report\[2023\]\.pdf
Фильтрация и экранирование массива строк:
$items = ['test.exe', 'document.pdf', 'file*.txt'];
$escaped = array_map('quotemeta', $items);
print_r($escaped);Результат:
Array
(
[0] => test\.exe
[1] => document\.pdf
[2] => file\*\.txt
)Хотя glob не требует экранирования, quotemeta может использоваться для подготовки строк:
$pattern = quotemeta('image[') . '0-9]' . quotemeta('.jpg');
echo $pattern;Результат:
image\[[0-9]\]\.jpg
Модуль re предоставляет функцию re.escape():
import re
print(re.escape('test.example'))Результат:
test\.example
Нет встроенной аналогичной функции, но можно использовать замену через регулярное выражение:
function quotemeta(str) {
return str.replace(/[\\\+\*\?\.\[\]\^\(\)\{\}\$\|]/g, '\\$&');
}
console.log(quotemeta('test*example'));Результат:
test\*example
Для экранирования специальных символов в операторе LIKE используется ESCAPE:
SELECT 'test_example' LIKE 'test\_example' ESCAPE '\';