假设我要创建一个PHP工具来根据正则表达式模式动态检查字符串。这样做有一个问题:定界符。
我希望能够执行以下操作(简化示例):
$pattern = $_POST['pattern'];
$matched = (preg_match($pattern, $_POST['string']) === 1);
我不希望用户在输入中放入定界符,而只是像^a[bc]+d
这样的纯模式。如何处理定界符?我可以这样做:
$pattern = '/' . $_POST['pattern'] . '/';
或使用任何其他可能的分隔符,但是转义该怎么办?将\
放在模式中的每个字符前面,是否与我选择的定界符相同就足够了吗?像这样:
$pattern = '/' . str_replace('/', '\\/', $_POST['pattern']) . '/';
处理定界符的整洁方法是什么?
答案 0 :(得分:-1)
您必须检查输入以识别分隔符(如果有)并将其删除。这样,如果用户遵守规则,则不必担心,但是如果不遵守,定界符将被删除。可以通过比较第一个和最后一个字符来识别定界符。
// 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);