PHP或Regex:字符串匹配搜索模式中的所有字符

时间:2011-11-24 00:10:32

标签: php regex

我需要构建一个正则表达式来查找输入字符串中所有字符的出现。

例如,如果用户输入“equ”作为搜索参数,“queen”和“obsequious”将匹配,但“qadaffi”和“tour”和“quail”则不匹配。

显然我正在尝试基本/ [equ] /模式,它正在寻找“至少一个”。

如果有一个基本的PHP函数可以在没有正则表达式的情况下执行此操作,那么这是可以接受的。但伤心。

4 个答案:

答案 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)/