Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/252.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP:处理动态正则表达式中的分隔符_Php_Regex - Fatal编程技术网

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

PHP:处理动态正则表达式中的分隔符,php,regex,Php,Regex,假设我想创建一个PHP工具,根据正则表达式模式动态检查字符串。这有一个问题:分隔符 我希望能够做到以下几点(简化示例): 我不希望用户在输入中输入分隔符,只是一个纯模式,如^a[bc]+d。如何处理分隔符?我可以这样做: $pattern = '/' . $_POST['pattern'] . '/'; 或者使用任何其他可能的分隔符,但是转义呢?将\放在模式中的每个字符之前,与我选择的分隔符相同,是否就足够了?像这样: $pattern = '/' . str_replace('/', '\\

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

我希望能够做到以下几点(简化示例):

我不希望用户在输入中输入分隔符,只是一个纯模式,如
^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\u match($sInput,$\u POST['string'])==1)

这不是我的问题所在。
我不希望用户在输入中放入分隔符
是的,即使用户放入分隔符,也会将其删除。首先,它不会回答我的问题。第二,为什么要对这么简单的事情使用
preg_replace
,而不是仅仅使用
str_replace('/','$input)
?在这种情况下,它也会做同样的事情。请参阅我的更新答案。分隔符可以是自定义的,例如:
~
。您可以检测到delimter,然后使用preg replace或str_replace将其删除。您所做的有什么问题吗?我担心可能存在一些我不知道的边缘情况。我认为这很好。恕我直言,在这里投票结束,因为没有实际问题,而且您所做的事情与它应该做的差不多。我唯一要说的是,您不需要对preg\u match进行严格的比较,您只需执行
$matched=preg\u match($pattern,$\u POST['string'))
它将返回true或false,我知道。不过,我更喜欢在大多数情况下使用
==
,以记住函数返回的内容。我的问题来自“我做得对吗?”这个家庭。老实说,我的要求只是为了教育目的。
$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