CI框架中PHP正则(不用转义)做法
PHP正则表达式在碰到要与正则相同的字符串时我们需要转义了,下面小编修改了CI框架中PHP正则之后我们再使用时不需要转义了可以直接使用,具体如下。
我们在书写PHP正则的时候,正则的修饰定义符通常定义为 / ,而定义为 / 的带来的麻烦是如果正则表达式含中有 / 则需要转义书写为 \/ 这让读正则的人看的比较晕乎。书写也比较烦琐。
为了避免这个情况,可以把正则的修饰定义符定义为 # 。
例子:
<?php
$uri = 'art/33/44';
preg_match_all('#^art(/\d+)(/\d+)#', $uri, $arr);
//等价于下面注释的
//preg_match_all('/^art(\/\d+)(\/\d+)/',$uri,$arr);
echo '<pre>';
var_dump($arr);话说CI框架,在路由解析功能上。也是这么干的。CI相关代码如下:
[路由定义文件application/config/routesphp]
$route['default_controller'] = "welcome"; $route['404_override'] = ''; $route['art/(\d+)(/\d*)'] = "test/aaa/$1/";
[路由解析类system/core/Router.php]
function _parse_routes() {
// Turn the segment array into a URI string
$uri = implode('/', $this->uri->segments);
// Is there a literal match? If so we're done
if (isset($this->routes[$uri])) {
return $this->_set_request(explode('/', $this->routes[$uri]));
}
// Loop through the route array looking for wild-cards
foreach ($this->routes as $key => $val) {
// Convert wild-cards to RegEx
$key = str_replace(':any', '.+', str_replace(':num', '[0-9]+', $key));
// Does the RegEx match?
echo '#^' . $key . '$#' . '---' . $uri;
echo '<br>';
if (preg_match('#^' . $key . '$#', $uri)) {
// Do we have a back-reference?
if (strpos($val, '$') !== FALSE AND strpos($key, '(') !== FALSE) {
$val = preg_replace('#^' . $key . '$#', $val, $uri);
}
return $this->_set_request(explode('/', $val));
}
}
// If we got this far it means we didn't encounter a
// matching route so we'll set the site default route
$this->_set_request($this->uri->segments);
}这样的话, 在CI框架里书写路由规则的时候,如果正则规则里有 / , 则可以不用转义!
本文地址:http://www.phprm.com/frame/72695.html
转载随意,但请附上文章地址:-)