我在PHP中使用preg_match / preg_replace函数:
/test\/([A-Za-z]+)\/([A-Za-z]+)\/?([A-Za-z]+)?\/?/
=>
test/\1_\2/\3/
我想要的是,如果它只说http://domain.com/test
那么无论是否有一个尾随斜线并不重要 - 我该怎么做?
编辑:
我这样做:
我有这个数组:
$routing = array(
'/test\/([A-Za-z]+)\/([A-Za-z]+)\/?([A-Za-z]+)?\/?/' => 'test/\1_\2/\3/',
'/error\/([0-9]+)/' => 'error/error_\1',
'/sitemap\.html/' => 'sitemap',
'/search\/([^\/]+)?/' => 'search/view/$1',
);
我所做的是,我执行此操作来路由URL:
global $routing;
foreach ( $routing as $pattern => $result ) {
if ( preg_match( $pattern, $url ) ) {
return preg_replace( $pattern, $result, $url );
}
}
return ($url);
我的框架在路由中执行此操作:
E.g。网址可以 测试/堆叠/你好/ 21 这是=到 测试:: stack_hello(21)
所以设置实际上是: controller / func / tion / parameter = function / func_tion / parameter。
答案 0 :(得分:0)
$regex = '#test(?:/([a-z]+))(?:/([a-z]+))(?:/([a-z]+))/?$#i';
这匹配包含test的字符串,后跟一个/和一系列字母,然后该模式再重复两次。要匹配的字符串的最后一个字符是可选的/(然后字符串应该因为$而结束)。该模式重复三次,因为这是所有三个匹配可用作替换模式的唯一方式。
$text = 'test/abc/de/f';
$replacement = 'test/\1_/\3/\2/'; // de and f should switch places
var_dump(preg_replace($regex, $replacement, $text));
显示字符串test/abc_/f/de/