Pek*_*ica 6 php regex preg-match
我希望能够像这样解析文件路径:
/var/www/index.(htm|html|php|shtml)
Run Code Online (Sandbox Code Playgroud)
进入有序数组:
array("htm", "html", "php", "shtml")
Run Code Online (Sandbox Code Playgroud)
然后生成一个备选列表:
/var/www/index.htm
/var/www/index.html
/var/www/index.php
/var/www/index.shtml
Run Code Online (Sandbox Code Playgroud)
现在,我有一个preg_match声明可以分为两种选择:
preg_match_all ("/\(([^)]*)\|([^)]*)\)/", $path_resource, $matches);
Run Code Online (Sandbox Code Playgroud)
有人可以给我一个指针,如何扩展它以接受无限数量的替代品(至少两个)?关于正则表达式,其余的我可以处理.
规则是:
列表需要以a开头并以a (结尾)
|列表中必须有一个(即至少两个备选方案)
任何其他事件(或)将保持不变.
更新:我需要能够处理多个括号对,例如:
/var/(www|www2)/index.(htm|html|php|shtml)
Run Code Online (Sandbox Code Playgroud)
对不起,我没有马上说出来.
更新2:如果您正在寻找我正在尝试在文件系统中执行的操作,请注意glob()已经开箱即用.无需实施自定义解决方案.有关详细信息,请参阅@ Gordon的答案.
我想你正在寻找:
/(([^ |] +)(|([^ |] +))+)/
基本上,把拆分器'|' 变成重复的模式.
另外,根据你的第三个要求,你的话应该是'不管道'而不是'不是'parens'.
此外,喜欢+到*这个问题.+意思是'至少一个'.*意味着'零或更多'.
非正则表达式解决方案:)
<?php
$test = '/var/www/index.(htm|html|php|shtml)';
/**
*
* @param string $str "/var/www/index.(htm|html|php|shtml)"
* @return array "/var/www/index.htm", "/var/www/index.php", etc
*/
function expand_bracket_pair($str)
{
// Only get the very last "(" and ignore all others.
$bracketStartPos = strrpos($str, '(');
$bracketEndPos = strrpos($str, ')');
// Split on ",".
$exts = substr($str, $bracketStartPos, $bracketEndPos - $bracketStartPos);
$exts = trim($exts, '()|');
$exts = explode('|', $exts);
// List all possible file names.
$names = array();
$prefix = substr($str, 0, $bracketStartPos);
$affix = substr($str, $bracketEndPos + 1);
foreach ($exts as $ext)
{
$names[] = "{$prefix}{$ext}{$affix}";
}
return $names;
}
function expand_filenames($input)
{
$nbBrackets = substr_count($input, '(');
// Start with the last pair.
$sets = expand_bracket_pair($input);
// Now work backwards and recurse for each generated filename set.
for ($i = 0; $i < $nbBrackets; $i++)
{
foreach ($sets as $k => $set)
{
$sets = array_merge(
$sets,
expand_bracket_pair($set)
);
}
}
// Clean up.
foreach ($sets as $k => $set)
{
if (false !== strpos($set, '('))
{
unset($sets[$k]);
}
}
$sets = array_unique($sets);
sort($sets);
return $sets;
}
var_dump(expand_filenames('/(a|b)/var/(www|www2)/index.(htm|html|php|shtml)'));
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
697 次 |
| 最近记录: |