我想给出匹配字符串与通配符*的可能性.
例
$mystring = 'dir/folder1/file';
$pattern = 'dir/*/file';
stringMatchWithWildcard($mystring,$pattern); //> Returns true
示例2:
$mystring = 'string bl#abla;y';
$pattern = 'string*y';
stringMatchWithWildcard($mystring,$pattern); //> Returns true
我以为像:
function stringMatch($source,$pattern) {
$pattern = preg_quote($pattern,'/');
$pattern = str_replace( '\*' , '.*?', $pattern); //> This is the important replace
return (bool)preg_match( '/^' . $pattern . '$/i' , $source );
}
基本上将*替换为* (考虑在* nix环境*匹配空字符串)©vbence
任何改进/建议?
//添加了return(bool),因为preg_match返回int
简单的
通配符
组件 (
PHP
5.3+)
该项目旨在为
php
提供一个简单的组件来支持
通配符
。
通配符
是
*
(零个或多个字符)和 ? (正好一个字符)。 该组件与
文件名
无关。 您也可以将它用于命名空间、url 和其他
字符串
。
为什么你不能为此提供一个简单的功能?
因为效率。 当您创建Pattern类的实例时,您还“编译”了该模式。 这意味着我会尝试为您以后的输入找到最佳的测试方法。 因此,如果您在同一次运行中更频繁地运行相同的模式,则可以从该优化中受益。 如果没有,界面应该仍然足够简单,让您满意。 如果没有,请围绕它包装一个函数。
为什么不直接使用正则表达式?
因为没有理由对最常见的数字使用正则表达式:
string
*
表示“以”开头。
*
string意思是“以”结尾。
所以即使我使用正则表达式来覆盖复杂的模式,对其中之一使用正则表达式也太没有意义了。 在内部,我使用 substr
/
*
*
*
方法1: 动态规划,令dp[i][j]表示,s[0~i-1] 与 p[0~j-1]是否
匹配
,对s、p而言,下标从0开始,而dp而言,下标表示第几个字符
*
状态转移方程为:
*
1. 当p[j-1]不为"
*
"时 :当s[i-1] 与 p[j-1]相等 或 p[j-1]是 "?"时, dp[i][j] = dp[i-1][j-1];
*
2. 当p[j-1]为"
*
"时 : dp[i][j] = dp[i-1][j] || dp[i][j-1] 解析...
$a = preg_match('/ph+p/','aaaphhhhhhhhhhpbbbp');
//第一个参数是
匹配
模式
//什么叫
匹配
,通过模式一个个比过去,注意这里是一个个
echo $a;
$a = preg_match('/ph{3}p/','aaaphhh...