[英]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.