繁体   English   中英

PHP如何将模式转换为正则表达式?

[英]PHP how to turn a pattern into a regex?

如何使模式成为正则表达式?

例如,我将this :id作为我的网址格式之一,我想将其变成一个正则表达式,以便它可以匹配123

$requestUrl = 'foo/1/';
$regex = 'foo/:id/';

$match = preg_match($regex, $requestUrl);

因此$match应该为true

我有这个,

$route = 'foo/:id/';
var_dump((preg_match_all('`(/|\.|)\[([^:\]]*+)(?::([^:\]]*+))?\](\?|)`', $route, $matches, PREG_SET_ORDER)));

但结果是int 0

为什么这么复杂? 正则表达式应该非常简单,就像这样:

foo/[0-9]+/

如果您想更加精确,并且仅在该字符串中没有其他内容的情况下进行匹配,则必须为行末尾添加锚点:

^foo/[0-9]+/$

请注意,这只是普通的正则表达式,如果要将其馈入函数preg_match() ,则由于该函数的工作原理,您必须采取一些其他步骤:

preg_match('/^foo\/[0-9]+\/$/', $requestUrl)

开始编写自己的正则表达式的一个好主意是使用许多在线正则表达式测试工具之一。 他们可以逐步发展您的表达方式。 如果您在使用功能文档时遇到问题,那么查看功能文档当然总是一个好主意: http : //php.net/manual/en/function.preg-match.php

关于将模式自动转换为正则表达式:这在一般情况下不容易回答。 对于您的示例,据我了解,该方法可能类似于:

$requestUrl = 'foo/1/';
$requestPattern = 'foo/:id/';

preg_match('/^(.*\/):id(\/.*)$/', $requestPattern, $tokens);
define('DELIM', '/');
$requestRegex = sprintf(DELIM.'^%s[0-9]+%s$'.DELIM, 
                        preg_quote($tokens[1], DELIM), 
                        preg_quote($tokens[2], DELIM));

echo preg_match($requestRegex, $requestUrl) ? 'true' : 'false';

说明:首先,准备对preg_match()调用,是从占位符:id 旁边的模式中提取那些部分。 然后,您可以在对sprintf()的以下调用中使用这些部分来构造您的正则表达式。 需要对preg_quote()进行调用,以preg_quote()现在要解释为在创建的正则表达式内的定界符的部分内的任何/字符。 为了更轻松地了解我公司推出的恒DELIM仅作为一个例子设为/这里。

显然,解决方案取决于模式的性质,我只能通过您给出的单个示例来猜测...

我有几点建议:

  1. 正则表达式模式的两端都需要有定界符(我用过! )。
  2. 如果您想获取数字,请使用( )专门创建一个捕获组
  3. 使用\\d类的元字符或字符类[0-9]来简化您的模式

    (对于多个数字,请使用+ (匹配一个或多个数字)或* (零或多个)

这是一个正在使用的示例:

$regex = "!foo\/(\d)\/!";
$requestUrl = "foo/1/";

$result = preg_match($regex, $requestUrl);

要练习和完善您的正则表达式,请尝试以下在线工具之一:

https://regex101.com/r/sB3bH9/1

暂无
暂无

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

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