解析字符串 - 正则表达式或类似的东西?

时间:2011-12-22 20:27:48

标签: php regex text-parsing

我正在编写路由类并需要帮助。我需要解析$ 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

有任何建议怎么做?

3 个答案:

答案 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];