【问题标题】:PHP Matching URI to PatternPHP 匹配 URI 到模式
【发布时间】:2012-10-19 06:09:50
【问题描述】:

我正在开发一个简单的前端控制器,主要用于学习目的。

我喜欢 Symfony 进行路由的方式,在你的地图中有这样的模式:/news/{category}/{id} 并将类别和 id 变量传递给控制器​​。但我的问题是 - 因为我无法使用 RegEx - 我不知道如何将模式与 URI 匹配。

应该怎么搭配

/news/{category}/{id}

/news/tech/5784

我是否应该允许这样的模式:/news/* - 其中* 匹配所有内容? 或者变量与一些垃圾混合在一起,比如/news/{category}_ex/14{id}

获取变量和值并不是什么大问题,但编写一个正则表达式进行匹配是。

提前感谢您的帮助

【问题讨论】:

  • 您是想在 Symphony 中设置路由,还是想弄清楚如何使正则表达式与您正在使用的 URL 匹配。我不相信 RegEx 真的是你需要的。
  • 我没有使用 Symfony。我想要实现的目标:我从用户那里得到了一个 URI,比如site.com/news/tech/5784,并且有一个带有地图的配置文件,地图包含模式及其重定向([0] 数组('pattern'=>'/news/ {category}/{id}', 'controller'=>'NewsController:Index' [1] ...)。我必须知道,如果请求的 URI 被映射,如果是,保存 uri 变量并传递给控制器。
  • 在这种情况下 pozs 和 anabhava 都有合适的答案 imo。唯一的问题是,您希望在 category 和 id 字段中允许什么?类别总是一个字符串吗? id 总是整数吗?这些在编写正则表达式时很重要。
  • 我不明白那个正则表达式是从哪里来的。我只知道我有一个 uri 和模式。如何将模式转换为这个正则表达式形式以匹配 uri?
  • 你是说我应该在我的配置文件中使用这个表单而不是 symfony 的方式吗? {变量}

标签: php uri match front-controller


【解决方案1】:

最简单的方法是使用名为sub-patterns 的(正则表达式)。

$regex = '#^/news/(?P<category>[a-z0-9]+)/(?P<id>[0-9]+)$#';
$path  = '/news/tech/5784';

if (preg_match($regex, $path, $matches))
{
    $matches['category'] === 'tech';
    $matches['id']       === '5784';
}

【讨论】:

  • 如果我在我的配置文件(路由)中使用子模式,那没关系,但是 {varible} 不是更好的可读性吗?
  • 这只是为了提高可读性-然后您应该使用带有路由的框架,它将(大部分)将其解码为像这样的正则表达式
【解决方案2】:

您最有可能在寻找PHP Subpatterns

$str = '/news/tech/5784';
if (preg_match('~^/news/(?<category>[^/]+)/(?<id>[^/]+)~', $str, $match))
   echo $match['category'] . " - " . $match['id'] . "\n";

输出:

tech - 5784

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-03-11
    • 1970-01-01
    • 2017-07-19
    • 2013-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多