2010-10-13 66 views
1

嗨,大家好,我在使用PCRE正確創建一個irc暱稱格式時遇到了一些問題。我對PCRE並不擅長,並且喜歡使用PCRE/regex的人的一些建議。 :)pcre表達irc暱稱?

我目前使用此表達式:/^([^A-Za-z]{1})([^A-Za-z0-9-.]{0,32})$/ 我使用它作爲這樣:preg_replace($regex, $replaceWith, $content)

我假定這意味着,從前面到月底開始,不屬於AZ,AZ任何字符,或者第一個字符爲0-9,則替換它。之後的任何字符,其中不是A-Z a-z,0-9, - 或。,都會替換它。

如果有人可以幫忙,你會幫助很大。這是阻止我將聊天產品發佈到新的論壇軟件的唯一因素。 :/

回答

0

我不確定你想要替換的是什麼,但最好檢查字符串是否與匹配的用戶名(而不是不匹配),然後替換,如果它不:

$regex = '/^[a-z][a-z0-9.-]{0,32}$/i'; 
if (!preg_match($regex, $content)) 
{ 
    // do your replace here 
} 

正則表達式表示:

^     # Beginning of string 
    [a-z]    # Match a single a-z 
    [a-z0-9.-]{0,32} # Match between 0 and 32 occurances of a-z, 0-9, . or - 
$     # End of string 
/i     # Make the pattern case-insensitive 
+0

我試圖替換與「」匹配的字符。對不起,忘了提到這一點。所提供的似乎沒有工作,但我已經得到了一些東西:「#([^ a-z0-9] {0,32})#我」 - 它可能不完全是我需要的,但我' m使用substr()不斷刪除第一個字符(如果它是一個數字),直到它是一個字母,符號或空白。如果您有任何其他建議,請告訴我。並感謝您的回覆/幫助:) – 2010-10-13 15:10:40

+0

如果您只是想刪除無效字符,請使用'preg_replace('/ [^ a-z0-9 .-] +/i','',$ content)'。您不應該試圖驗證*和*修復相同操作中的格式。 – 2010-10-13 15:22:23

+0

根據[這個問題](http://stackoverflow.com/questions/5163255/regular-expression-to-match-irc-nickname/5163309#5163309)你上面的字符集對於IRC暱稱太過於限制。 – Phrogz 2011-04-28 02:58:35

1

我一直在使用正則表達式之後,我IRC日誌來檢查暱稱:

採用0

它在的preg_match像這樣:

preg_match('/<([a-zA-Z\[\]\\`_\^\{\|\}][a-zA-Z0-9\[\]\\`_\^\{\|\}-]{1,31})>/', $line) 

我只是檢查用戶是否表示東西就行與行不只是一個參加排序的/部分消息或劃痕改變什麼,但它也很容易放入preg_replace。

它根據在RFC 2812 Section 2.3.1暱稱規則,其中指出的第一個字符必須是字母(a-zA-Z)或特殊([]{}^`|_\)和字符的其餘部分可以是字母,特殊的,數字的刻痕相匹配(0-9)或連字符(-)。我選擇了基於GTAnet的NICKLEN=32而不是RFC的最大長度爲9的最大長度爲32,因爲許多網絡似乎不遵循此標準。不同的IRC網絡之間的最大長度不同,因此可以根據需要進行調整。