php - PHP:处理动态正则表达式中的分隔符
问题描述
假设我想创建一个 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);
推荐阅读
- logging - 为什么 ariflow 登录 google cloud composer 突然出现 '[Errno -2] name or service not know' 导致的错误?
- angular - 从另一个不使用 EventEmitter() 的组件调用函数
- mysql - 将 CLOUD-SQL 连接到 Google-Data-Studio,出了什么问题?
- sql - Oracle SQL 开发人员显示以下代码的无效编号
- git - 如何在 GitKraken 上创建新提交而不是快速合并
- azure - 修改 PowerShell 脚本以更改 Outlook 的默认字体类型和大小
- javascript - 如果需要,遍历 URL 并添加/替换字符串
- angularjs - ng-view 在我的 angularJS 应用程序中没有显示任何内容
- vb.net - 如何使用参数分解对 ado.net 的调用?
- dynamics-crm - 在电子邮件模板中添加动态链接的问题 - CRM Dynamics 365