2010-11-13 113 views
0

我正在編寫一些代碼,需要搜索字符串中的某些符號。我爲此使用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!

任何人都可以請幫忙嗎?

+0

不確定您的實際使用情況。但是,當preg_split沒有規範化它時,array_unique()對UTF-8序列化無動於衷。它可能分得很好? * * *和**?**,如果他們有不同的編碼。並輸入文字「isthisright ???'?'?」可能不會被「?????」匹配(allthough這正是mb_strpos的用途?)。無論如何,我不確定美元組合將如何在$字符串中。如果您手動編寫特定的mb_strpos()匹配,它會起作用嗎? – mario 2010-11-13 14:16:07

+1

我對這裏的一些事情感到困惑: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

+0

我試圖解釋這個函數打算做什麼。它應該檢測一個字符串是否包含連續五次以上的符號。例如一個字符串「something ?????」或「sommmmmthing?」應該返回false,否則應該返回true。 我已經設置在文章標題的最小長度的限制,因此用戶往往想要達到的極限以這種方式...... – 2010-11-13 14:44:30

回答

1

那麼,我可以建議以不同的方式來做嗎?

function symbolsInRow($string, $limit = 5) { 
    $regex = '/(.)\1{'.($limit - 1).',}/us'; 
    return 0 == preg_match($regex, $string); 
} 

所以基本上它只是看起來在任何字符的行(或更多)重複$limit倍。如果發現任何錯誤,則返回false。否則返回true ...

+0

此代碼具有我在上面的問題中描述的相同的問題。例如,它不會捕獲連續五個問號或點! – 2010-11-13 15:20:07

+0

@Levani:當然可以(我修正了正則表達式中的一個小錯誤)......如果不是你,我不得不懷疑問號是否實際上是相同的字符......將字符串轉換爲十六進制看看他們是否是完全一樣的人物... http://dev.meagar.net/preg.php?preg=/(.)\1{4,}/us&query=abc.....&replace= – ircmaxell 2010-11-13 15:23:26

1

你可以用一個簡單的正則表達式做到這一點:

<pre> 
<?php 

$str="Lorem ipsum ?????? dolor sit amet xxxxx ? consectetuer faucibus."; 
preg_match_all('@(.)\1{4,}@s',$str,$out); 
print_r($out); 
?> 
</pre> 

要解釋的表達:

(.)相匹配的所有字符和它創建了一個參考
\1用途此參考
{4,}參考具有發生4次以上(因此與此4個字符和基準本身你將匹配5個相同字符)