2012-02-17 82 views
16

我已經得到了一些工作代碼,但我需要有人來幫助解釋爲什麼它可以工作!正則表達式只允許字母數字,逗號,連字符,下劃線和分號

如果它不是az,AZ,0-9,逗號,分號,下劃線或連字符(最終應代表單個用戶名或一個用戶名),則使用PHP替換字符串中的任何內容逗號/分號分隔的用戶名列表)。

以下工作:

$data = preg_replace('/[^,;a-zA-Z0-9_-]/s', '', $data); 

但以下不會:

$data = preg_replace('/[^a-zA-Z0-9_-,;]/s', '', $data); 

爲什麼會這樣,只有當逗號和分號是在開始工作?把它們放在最後似乎會破壞事情(這是我在遇到/ [^ a-zA-Z0-9 _-]/s時最初嘗試過的東西

另外,我還使用以下內容修剪任何尾隨分號(複數)或逗號(複數),有人可能能夠提出更有效的和/或優雅的方式來做到這一點?:

if(preg_match('/;$/', $data)) 
{ 
    $data = rtrim($data, ';'); 
} 
if(preg_match('/,$/', $data)) 
{ 
    $data = rtrim($data, ','); 
} 

感謝所有幫助:)

回答

27

這不是導致問題的逗號和分號;這是連字符。看看你的性格類的各個部分,並考慮他們的意思:

0-9 # Anything from '0' to '9', meaning 0, 1, 2, ... 9 
A-Z # Anything from 'A' to 'Z', meaning A, B, C, ... Z 
_-, # Anything from '_' to ',', meaning...uh...hmmm. 

有沒有明確的進展,從_,,所以正則表達式引擎是不知道該怎麼利用這一點。在字符類中,如果希望字面解釋連字符,它需要在類的開頭或結尾(或用反斜線轉義)。所以,任何一個將工作:

[^,;a-zA-Z0-9_-] 
[^-,;a-zA-Z0-9_] 
[^a-zA-Z0-9_\-,;] 

至於修去年底,你可以做到這一切在一個正則表達式替換:

$data = preg_replace('/[^,;a-zA-Z0-9_-]|[,;]$/s', '', $data); 
+0

_「從_ 'to',''_ _:有一個非常明確的進程:它基於Unicode表。然而,在這種情況下,'_'在Unicode表中是_after_',',所以範圍是不可能的。 – Xufox 2015-10-27 21:40:34

+0

@Xufox - 恩,那會讓它迴歸,不是嗎? ;)關鍵是沒有任何正則表達式引擎可以理解的進程。但是你是對的,(從另一個方向看,這是一個有效的進展)(http://rextester.com/YGC93292),從','到'_'。直到現在我還不知道,謝謝! – 2016-03-14 15:33:26

2

我認爲這是重要的連字符的位置 - 必須在開始或結束時作爲連字符(文字),否則將用於定義範圍。

+0

+1另外請注意,你可以簡單地用一個反斜槓在第二種模式中逃脫流氓連字符,它的工作方式與第一種模式相同:''[[[a-zA-Z0-9 _ \ - ,;]]/s'' – rdlowrey 2012-02-17 18:24:13

1

可以逃避連字符,並把它的任何地方在正則表達式這樣\-

至於尾隨分號和逗號,試試這個/[,;]+$/應該在即使他們是許多最終匹配任何逗號和分號。

相關問題