[英]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.