Php 用正则表达式或类似的东西分析字符串?
我正在写路由类,需要帮助。我需要解析$controller变量并将该字符串的一部分分配给另一个变量。以下是$controller的示例:Php 用正则表达式或类似的东西分析字符串?,php,regex,text-parsing,Php,Regex,Text Parsing,我正在写路由类,需要帮助。我需要解析$controller变量并将该字符串的一部分分配给另一个变量。以下是$controller的示例: $controller = "admin/package/AdminClass::display" //$path = "admin/package"; //$class = "AdminClass"; //$method = "display"; $controller = "AdminClass::display"; //$path = ""; //$c
$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";
这三种情况就是我所需要的。是的,我可以编写长过程来处理这种情况,但我需要的是使用regex的简单解决方案,以及函数preg\u match\u all
有什么建议吗?下面的正则表达式应该可以为您完成这项工作,然后您可以将捕获的组保存到
$path
、$class
和$method
(?:(.+)/)?(?:(.+)::)?(.+)
这是一个红宝石:
您的php代码可能如下所示:
$regex = '/(?:(.+)\/)?(?:(.+)::)?(.+)/';
preg_match($regex, $controller, $matches);
$path = $matches[1];
$class = $matches[2];
$method = $matches[3];
$pieces=分解('/',$controller);
$path='';
对于($i=$i这假设类中的路径和方法名只能包含字母
完整正则表达式如下所示:
^(?:((?:[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]+):)([a-zA-Z]+)$
呸。关于其他解析情况/您可能需要解析的其他字符串,请在您的问题中更加具体。第一到第二个值可以通过replace/substring/split完成。为什么您需要使用regex?@CanSpice来匹配这三种情况,然后将字符串的一部分提取到variablesThanks!如果您有我可以提供的链接的话易学正则表达式我将非常感激:)我用它作为备忘,那个网站有一些很好的教程。Rubular对于快速测试正则表达式也非常有用。它还将匹配a/b
,这不是合法的输入!第二个正则表达式返回带有方法AdminClass::display的类。我认为F.J.的正则表达式也可以使用,它确实可以用一个正则表达式完成,并且没有错误,但它将是一个非常长的正则表达式,需要更多的解释;)如果你愿意的话,我可以把它编出来解释一下。这不也会匹配a/b
并把它全部放进$method
?是的,这就是为什么我建议用限制性更强的正则表达式替换*
。但请参见edit.Done。现在有了完整的pizzazz:p
^(?:((?:[a-zA-Z]+/)*)([a-zA-Z]+)::)?([a-zA-Z]+)$