我正在编写路由类并需要帮助。我需要解析$ controller变量并将该字符串的一部分分配给另一个变量。以下是$ controller:
的示例$controller = "admin/package/AdminClass::display"
//$path = "admin/package";
//$class = "AdminClass";
//$method = "display";
$controller = "AdminClass::display";
//$path = "";
//$class = "AdminClass";
//$method = "display";
$controller = "display"
//$path = "";
//$class = "";
//$method = "display";
这三种情况都是我需要的。是的,我可以编写长程序来处理这种情况,但我需要的是使用正则表达式的简单解决方案,函数preg_match_all
有任何建议怎么做?
答案 0 :(得分:5)
以下正则表达式应该为您完成此操作,然后您可以将捕获的组保存到$path
,$class
和$method
。
(?:(.+)/)?(?:(.+)::)?(.+)
这是一个Rubular: http://www.rubular.com/r/1vPIhwPUub
您的PHP代码可能如下所示:
$regex = '/(?:(.+)\/)?(?:(.+)::)?(.+)/';
preg_match($regex, $controller, $matches);
$path = $matches[1];
$class = $matches[2];
$method = $matches[3];
答案 1 :(得分:3)
这假设类中的路径和方法名称只能包含字母。
完整的正则表达式如下:
^(?:((?:[a-zA-Z]+/)*)([a-zA-Z]+)::)?([a-zA-Z]+)$
两个非捕获组:第一个使所有路径和类可选,第二个避免捕获单个路径元素。
说明:
[a-zA-Z]+/
; *
量词应用到上面;但正则表达式不是原子,因此我们需要一个小组。由于我们不想捕获单个路径元素,因此我们使用非捕获组:(?:[a-zA-Z]+/)*
; ((?:[a-zA-Z]+/)*)
; ([a-zA-Z]+)
; ((?:[a-zA-Z]+/)*)([a-zA-Z]+)::
; (?:((?:[a-zA-Z]+/)*)([a-zA-Z]+)::)?
; (?:((?:[a-zA-Z]+/)*)([a-zA-Z]+)::)?([a-zA-Z]+)
; ^(?:((?:[a-zA-Z]+/)*)([a-zA-Z]+)::)?([a-zA-Z]+)$
呼。
答案 2 :(得分:-1)
$pieces = explode('/',$controller);
$path = '';
for($i = $i<$pieces.length-1; $i++)
{
if($i != 0)
$path+='/';
$path += $pieces[$i];
}
$p2 = explode( '::',$pieces[$pieces.length-1]);
$class = $p2[0];
$method = $p2[1];