首页 > 解决方案 > PHP:处理动态正则表达式中的分隔符

问题描述

假设我想创建一个 PHP 工具来根据正则表达式模式动态检查字符串。这样做有一个问题:分隔符。

我希望能够执行以下操作(简化示例):

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

我不希望用户在输入中放置分隔符,只是一个纯模式,比如^a[bc]+d. 如何处理分隔符?我可以这样做:

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

或者使用任何其他可能的分隔符,但是转义呢?放置\在模式中的每个字符之前,与我选择的分隔符相同,就足够了吗?像这样:

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

什么是处理分隔符的巧妙方法?

标签: phpregex

解决方案


您必须检查输入以识别分隔符(如果有)并将其删除。这样,如果用户遵循规则,您不必担心,但如果他们不这样做,分隔符无论如何都会被删除。分隔符可以通过比较第一个和最后一个字符来识别。

// 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);


推荐阅读