Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/240.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 用正则表达式或类似的东西分析字符串?_Php_Regex_Text Parsing - Fatal编程技术网

Php 用正则表达式或类似的东西分析字符串?

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变量并将该字符串的一部分分配给另一个变量。以下是$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";
这三种情况就是我所需要的。是的,我可以编写长过程来处理这种情况,但我需要的是使用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]+)$