PHP 具有递归过滤字符串并将子字符串追加到数组的正则表达式

PHP Regex with recursively filter string and append sub-string to array

我基本上是想在字符“/”之后提取字符串的一部分,但使用 PHP PCRE(正则表达式)而不是 PHP substr() 函数,我想测试一下如果初始字符串有多个“/”字符,则使用 PHP PCRE(正则表达式)和 preg_match() 或 preg_match_all() 的组合。

我能够 select 使用正则表达式进行单次迭代。

<?php
  $rules = array(
    'dbl'     => "/(?'d'[^/]+)/(?'p'[^/]+)", // '.../a/a' DOUBLE ITERATION
    'single'     => "/(?'d'[\w\-]+)",// '.../a' SINGLE ITERATION
    'multiple'     => "" //MULTIPLE ITERATION
  );
  $string = "a/b/c/d/e";
  foreach ( $rules as $action => $rule ) {
    if ( preg_match_all( '~^'.$rule.'$~i', $string, $params ) ) {
      switch ($action) {
        case 'multiple':
          $arr = explode("/", $string);
          print_r($arr);
          //do something
        ...
      }
    }
  }


?>

我知道这是因为我对正则表达式的了解不够,但是,我需要一个动态的正则表达式代码来匹配初始字符串有多个“/”字符的条件,然后将这些子字符串递归存储到一个数组。

我会采用不同的方法:我会首先在 / 上展开 $string,然后根据结果中的元素数量应用逻辑。

<?php
  $string = "a/b/c/d/e";
  $arr = explode("/", $string);
  if (count($arr) > 2) {
    print_r($arr);
    // do something knowing there were 2 or more slashes in $string
  }
?>

如果您需要对 0、1 或 2 个斜杠执行不同的操作,请在 $arr 中添加 elseif 块测试以减少元素,并将相应的操作放在那里。

要回答这个问题,请使用 Wiktor Stribiżew 的正则表达式代码:

<?php
  $rules = array(
    'dbl'     => "/(?'d'[^/]+)/(?'p'[^/]+)", // '.../a/a' DOUBLE ITERATION
    'single'     => "/(?'d'[\w\-]+)",// '.../a' SINGLE ITERATION
    'multiple'     => "/[^/]+(?:/[^/]+){2,}/?" //MULTIPLE ITERATION
  );
  $string = "a/b/c/d/e";
  foreach ( $rules as $action => $rule ) {
    if ( preg_match_all( '~^'.$rule.'$~i', $string, $params ) ) {
      switch ($action) {
        case 'multiple':
          $arr = explode("/", $string);
          print_r($arr);
          //do something
        ...
      }
    }
  }


?>

对于引用此资源的其他人,请为 Wiktor Stribiżew 的回答点赞一次/如果他发布了它。