【问题标题】:Friendly URL with " : "带有“ : ”的友好 URL
【发布时间】:2012-06-05 05:36:36
【问题描述】:

我有以下代码,它得到$_GET 并按控制器、动作和参数进行划分

http://localhost/controller/action/param1/param2

$url = explode('/', $_GET['url']);
$urlSize = count($url);
$filter = $this->factory('Core\Security\Filter');

if($urlSize >= 1) {
    $controller = $filter->replace($url[0], 'friendly-url');

    if($urlSize >= 2) {
        $action = $filter->replace($url[1], 'friendly-url');

        if($urlSize >= 3) {
            unset($url[0], $url[1]);

            foreach($url as $index => $param) {
                $params[] = $filter->replace($param, 'friendly-url');
            }
        }
    }
}

Core\Security\Filter->replace() 我现在正在开发:

public function replace($data = null, $type = 'alphanumeric') {
    /*
        @TODO, implement regex by type

        numeric
                $regex = '/^[[:digit:]]$/';
        alphanumeric
                $regex = '/^[[:alnum:]]$/';
        friendly-url
                $regex = '/[^a-zA-Z0-9_-]+/';
                $replace = '-'
        username
                $regex = '/^[^a-zA-Z0-9_-.]{3,32}+';
        email
                $regex = '/^[[a-zA-Z0-9_-.]{1,96}]+@[a-zA-Z0-9-]{2,64}+(?:\.[a-zA-Z0-9-]+)*$/';
    */
}

好的,我遇到的问题是:如何获取这种格式的网址:

http://localhost/controller/action/param1/param2:value2

$param 数组:

Array(
    [0] => param1
    [1] => Array(
       [param2] => value2
    )
)

已解决:

foreach($url as $index => $param) {
    if(strstr($param, ':')) {
        $subParam = explode(':', $param, 2);
        $this->_request['params'][][$subParam[0]] = $filter->replace($subParam[1], 'friendly-url-param');
    } else {
        $this->_request['params'][] = $filter->replace($param, 'friendly-url-param');
    }
}

【问题讨论】:

  • 请在上面加糖使用filter_var($str, FILTER_VALIDATE_EMAIL),而不是与一大堆有效电子邮件地址不匹配的正则表达式,主题为coveredhereat@987654324 @
  • 警告:URI 中的冒号是disallowed in windows apache。因此,最好避免在 PHP 应用程序中的 URL 中使用冒号。
  • 其中一个要求不是 Windows 服务器 ;)
  • @DaveRandom 这个案例,FILTER_SANITIZE_EMAIL 因为,我想要经过净化的电子邮件,而不是检查是否有效。

标签: php regex friendly-url


【解决方案1】:
<?php

$url = 'http://localhost/controller/action/param1/param2:value2';

$parts = parse_url($url);
$path = $parts['path'];

list($controller, $action, $params) = explode('/', ltrim($path, '/'), 3);

function parse_params($params) {
    $parsed_params = array();
    $path_segments = explode('/', $params);
    foreach ($path_segments as $path_segment) {
        if (strstr($path_segment, ':')) {
            list($k, $v) = explode(':', $path_segment, 2);
            $parsed_params[] = array($k => $v);
        } else {
            $parsed_params[] = $path_segment;
        }
    }
    return $parsed_params;
}



$params = parse_params($params);

print_r($params);

输出

Array
(
    [0] => param1
    [1] => Array
        (
            [param2] => value2
        )

)

【讨论】:

  • 可能 REGEX 不能完成这项工作。但是,根据您的回答,我已经用更新的问题解决了我的问题。谢谢!
猜你喜欢
  • 2014-02-26
  • 2013-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-18
  • 2019-11-08
  • 2017-02-14
  • 2014-07-09
相关资源
最近更新 更多