我需要构建一个正则表达式来查找输入字符串中所有字符的出现。
例如,如果用户输入“equ”作为搜索参数,“queen”和“obsequious”将匹配,但“qadaffi”和“tour”和“quail”则不匹配。
显然我正在尝试基本/ [equ] /模式,它正在寻找“至少一个”。
如果有一个基本的PHP函数可以在没有正则表达式的情况下执行此操作,那么这是可以接受的。但伤心。
答案 0 :(得分:3)
/[equ]/
是一个字符类,这意味着它只匹配一个字符。请尝试使用/.*equ.*/
。我没有使用php匹配函数,因此.*
可能是不必要的。
编辑:显然他们绝对没必要,所以只需使用/equ/
。
答案 1 :(得分:2)
是的,同意简单的for循环在你的情况下会更有效。
假设$query = "que";
和$input = "queen";
或其他任何内容:
$matched = true;
$len = strlen($query); // or mb_strlen($query) if you have multibyte string in input
for ($i = 0; $i < $len; $i++){
if (!strstr($input, $query[$i])){
$matched = false;
break;
}
}
非常原始的循环开始。
答案 2 :(得分:2)
@sln @jancha
我已经实施了一个计时器来测量速度。奇怪的是,我发现正则表达式比我的代码中的循环更快。这是对的吗?
$haystack = "Obsequious";
$needle = array('e','q','u');
$regex = "/^(?=.*e)(?=.*q)(?=.*u)/";
function trial(){
GLOBAL $haystack;
GLOBAL $needle;
foreach ($needle as $n) {
if (!strpos($haystack, $n)) return false;
}
return true;
}
function trial2(){
GLOBAL $haystack;
GLOBAL $regex;
if (preg_match($regex, $haystack)) {
return true;
}
return false;
}
print time_trial("trial");
print time_trial("trial2");
function time_trial($function, $iterations=100000){
$before = microtime(true);
for ($i=0 ; $i<$iterations ; $i++) {
call_user_func($function);
}
$after = microtime(true);
$total = round($after-$before, 4);
return "Executed timed trial '$function' // $iterations iterations // $total seconds<br />\n";
}
答案 3 :(得分:0)
正则表达式可能不是这项工作的工具。不是php专家,而是遍历每个必需的字符,检查它是否存在于对象字符串中。
否则,使用正则表达式大致相同,但它的速度过快和过度杀伤:
/^(?=.*e)(?=.*q)(?=.*u)/