繁体   English   中英

PHP:处理动态正则表达式中的分隔符

[英]PHP: Deal with delimiters in dynamic regular expression

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

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

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

我不希望用户在输入中放入定界符,而只是像^a[bc]+d这样的纯模式。 如何处理定界符? 我可以这样做:

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

或使用其他可能的分隔符,但转义该怎么办? \\放在模式中的每个字符前面,是否与我选择的定界符相同就足够了吗? 像这样:

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

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

您必须检查输入以识别分隔符(如果有)并将其删除。 这样,如果用户遵守规则,则不必担心,但是如果不遵守,定界符将被删除。 可以通过比较第一个和最后一个字符来识别定界符。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM