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 的回答点赞一次/如果他发布了它。
我基本上是想在字符“/”之后提取字符串的一部分,但使用 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 的回答点赞一次/如果他发布了它。