我正在編寫一些代碼,需要搜索字符串中的某些符號。我爲此使用mb_strpos函數,它適用於字母符號,但如果我搜索符號如問號,點等,則不適用。例如,如果我在字符串mb_strpos中搜索「aaaaa」(或任何其他unicode字符)按預期工作,但如果我搜索「?????」它不!搜索字符串中的符號
這是我的代碼:
function symbols_in_row($string, $limit=5) {
//split string by characters and generate new array containing each character
$symbol = preg_split('//u', $string, -1, PREG_SPLIT_NO_EMPTY);
//remove duplicate symbols from array
$unique = array_unique($symbol);
//generate combination of symbols and search for them in string
for($x=0; $x<=count($unique); $x++) {
//generate combination of symbols
for($c=1; $c<=$limit; $c++) {
$combination .= $unique[$x];
}
//search for this combination of symbols in given string
$pos = mb_strpos($string, $combination);
if ($pos !== false) return false;
}
return true;
}
它總是在第二種情況下返回true!
任何人都可以請幫忙嗎?
不確定您的實際使用情況。但是,當preg_split沒有規範化它時,array_unique()對UTF-8序列化無動於衷。它可能分得很好? * * *和**?**,如果他們有不同的編碼。並輸入文字「isthisright ???'?'?」可能不會被「?????」匹配(allthough這正是mb_strpos的用途?)。無論如何,我不確定美元組合將如何在$字符串中。如果您手動編寫特定的mb_strpos()匹配,它會起作用嗎? – mario 2010-11-13 14:16:07
我對這裏的一些事情感到困惑:1)$組合變量。你沒有給它一個初始價值就連結在一起。 2)$組合不會重置,所以它只會在嵌套循環中增長和增長。 3)這個函數一般打算做什麼?是否symbol_in_row(「aaa」,3)應該返回true,但symbols_in_row(「aaa」,4)應該返回false? 4)如果你*用mb_strpos()找到它 - 爲什麼你返回false?你不想回報真實嗎? – 2010-11-13 14:21:30
我試圖解釋這個函數打算做什麼。它應該檢測一個字符串是否包含連續五次以上的符號。例如一個字符串「something ?????」或「sommmmmthing?」應該返回false,否則應該返回true。 我已經設置在文章標題的最小長度的限制,因此用戶往往想要達到的極限以這種方式...... – 2010-11-13 14:44:30