簡體   English   中英

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

[英]PHP or Regex: string matches ALL characters in search pattern

我需要構建一個正則表達式,以查找輸入字符串中所有字符的出現。

例如,如果用戶輸入“ equ”作為搜索參數,則“ queen”和“ obsequious”將匹配,但是“ qadaffi”,“ tour”和“ quail”將不匹配。

顯然,我正在嘗試基本的/ [equ //]模式,它正在尋找“至少一個”。

如果有一個基本的PHP函數無需正則表達式就可以執行此操作,那將是可以接受的。 但是可悲。

/[equ]/是一個字符類,這意味着它僅匹配一個字符。 請嘗試/.*equ.*/ 我沒有使用過php匹配功能,因此.*可能是不必要的。

編輯:顯然,它們絕對是不必要的,因此只需使用/equ/

是的,同意簡單的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;
    }
}

首先是非常原始的循環。

@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";
}

正則表達式可能不是這項工作的工具。 不是php專家,而是遍歷每個必需的字符以檢查它是否存在於對象字符串中。

否則,使用正則表達式可以達到相同的目的,但是速度慢且過大:

/^(?=.*e)(?=.*q)(?=.*u)/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM