PHP: работа с разделителями в динамическом регулярном выражении - PullRequest
0 голосов
/ 05 декабря 2018

Допустим, я хочу создать инструмент PHP для динамической проверки строки по шаблону регулярного выражения.Есть одна проблема с этим: разделители.

Я хотел бы иметь возможность сделать следующее (упрощенный пример):

$pattern = $_POST['pattern'];
$matched = (preg_match($pattern, $_POST['string']) === 1);

Я не хочу, чтобы пользователи помещали разделители ввход, просто чистый шаблон, как ^a[bc]+d.Как бороться с разделителями?Я мог бы сделать это:

$pattern = '/' . $_POST['pattern'] . '/';

Или с любым другим возможным разделителем, но как насчет побега?Достаточно ли поместить \ перед каждым символом в шаблоне, будучи тем же, что и выбранный мной разделитель?Вот так:

$pattern = '/' . str_replace('/', '\\/', $_POST['pattern']) . '/';

Что такое аккуратный способ борьбы с разделителями?

1 Ответ

0 голосов
/ 05 декабря 2018

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

// with incorrect input.
$input = "/^a[bc]+d/"; // from $_POST['pattern']
$delim = "/";
if ($input[0] === $input[strlen($input) - 1]) {
    $delim = $input[0];
}
$sInput = str_replace($delim,"",$input);
echo $sInput; // ^a[bc]+d

При правильном вводе вам не нужно беспокоиться.

$input = "^a[bc]+d"; // from $_POST['pattern']
$delim = "/";
if ($input[0] === $input[strlen($input) - 1]) {
    $delim = $input[0];
}
$sInput = str_replace($delim,"",$input);
echo $sInput; // ^a[bc]+d

$sInput - ваш очищенный шаблон,Вы можете использовать его непосредственно для проверки вашей строки.

$ matched = (preg_match ($ sInput, $ _POST ['string']) === 1);

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...