Regular Expression to match unlimited number of options(匹配不限数量的选项的正则表达式)
本文介绍了匹配不限数量的选项的正则表达式的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我希望能够分析如下文件路径:
/var/www/index.(htm|html|php|shtml)
转换为有序数组:
array("htm", "html", "php", "shtml")
然后生成备选方案列表:
/var/www/index.htm
/var/www/index.html
/var/www/index.php
/var/www/index.shtml
现在,我有一个preg_match
语句可以拆分两个备选方案:
preg_match_all ("/(([^)]*)|([^)]*))/", $path_resource, $matches);
有人能告诉我如何扩展它以接受无限数量的替代方案(至少两个)吗?只是关于正则表达式,其余的我可以处理。
规则是:
列表需要以
(
开头,以)
结尾
列表中必须有一个
|
(即至少有两个备选方案)(
或)
的任何其他事件将保持不变。
更新:我还需要能够处理多个括号对,例如:
/var/(www|www2)/index.(htm|html|php|shtml)
抱歉,我没有直接说出来。
更新2:如果您希望在文件系统中执行我正在尝试执行的操作,请注意,GLOB()已经提供了该功能。不需要实施定制解决方案。有关详细信息,请参阅下面@Gordon的答案。
推荐答案
非正则表达式解决方案:)
<?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)'));
这篇关于匹配不限数量的选项的正则表达式的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
沃梦达教程
本文标题为:匹配不限数量的选项的正则表达式
基础教程推荐
猜你喜欢
- XAMPP 服务器不加载 CSS 文件 2022-01-01
- mysqli_insert_id 是否有可能在高流量应用程序中返回 2021-01-01
- Libpuzzle 索引数百万张图片? 2022-01-01
- 通过 PHP SoapClient 请求发送原始 XML 2021-01-01
- 在 Woocommerce 中根据运输方式和付款方式添加费用 2021-01-01
- 如何在 PHP 中的请求之间持久化对象 2022-01-01
- 在多维数组中查找最大值 2021-01-01
- 超薄框架REST服务两次获得输出 2022-01-01
- 在 PHP 中强制下载文件 - 在 Joomla 框架内 2022-01-01
- WooCommerce 中选定产品类别的自定义产品价格后缀 2021-01-01