Quotemeta: примеры (PHP)

Функция quotemeta для обработки специальных символов
Раздел: Работа со строками
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('') . ']';

Результат:

[]
Похожие функции в PHP

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
Изменения в версиях PHP

Функция quotemeta существует с ранних версий PHP и не претерпела значительных изменений. В PHP 8 функция работает стабильно без изменений синтаксиса или поведения.

Расширенные примеры

Использование в регулярных выражениях

Экранирование пользовательского ввода для безопасного использования в preg_match:

Пример php
$user_input = 'file.*.txt';
$pattern = '/^' . quotemeta($user_input) . '$/';
echo $pattern;
// Использование
if (preg_match($pattern, 'file.*.txt')) {
    echo 'Совпадение найдено';
}

Результат:

/^file\.\*\.txt$/
Обработка путей в файловой системе

Создание безопасного шаблона для поиска файлов:

Пример php
$filename = 'report[2023].pdf';
$safe_pattern = quotemeta($filename);
echo $safe_pattern;

Результат:

report\[2023\]\.pdf
Комбинация с другими функциями обработки строк

Фильтрация и экранирование массива строк:

Пример php
$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

Хотя glob не требует экранирования, quotemeta может использоваться для подготовки строк:

Пример php
$pattern = quotemeta('image[') . '0-9]' . quotemeta('.jpg');
echo $pattern;

Результат:

image\[[0-9]\]\.jpg
Аналоги в других языках
Python

Модуль re предоставляет функцию re.escape():

import re
print(re.escape('test.example'))

Результат:

test\.example
JavaScript

Нет встроенной аналогичной функции, но можно использовать замену через регулярное выражение:

function quotemeta(str) {
    return str.replace(/[\\\+\*\?\.\[\]\^\(\)\{\}\$\|]/g, '\\$&');
}
console.log(quotemeta('test*example'));

Результат:

test\*example
MySQL

Для экранирования специальных символов в операторе LIKE используется ESCAPE:

SELECT 'test_example' LIKE 'test\_example' ESCAPE '\';

PHP quotemeta function comments

En
Quotemeta Quote meta characters