2011-10-05 104 views
0

有人可以告訴我這兩個正則表達式之間的區別嗎?正則表達式差異

'/[^a-zA-Z0-9\s]/' 

'~[^A-Za-z0-9_]~' 

此外,有沒有第一個正則表達式內的空間語法錯誤?認爲它需要像這樣:/\s才能正確轉義。

基本上,我需要一個正則表達式,它只使用英文A-Z,a-z,0-9和下劃線!其他所有內容都需要用空字符串''替換。所以,我知道我需要preg_replace來做到這一點,但哪個RegEx更好用,爲什麼?

謝謝很多傢伙!

+0

'\ s'意思是'任何空格字符',所以你會想使用第二個。我不知道關於'/'和'〜'哪個更好。 – Bojangles

+0

那麼,使用第一個會讓空白字符通過比正確的? – SoLoGHoST

+0

我對'〜'和'/'之間的區別也很感興趣。有什麼不同? – SoLoGHoST

回答

1

PCRE模式字符串的第一個字符是一個分隔符,用於標記正則表達式的結尾和modifier characters的開頭。選擇是任意的;您可以使用'/''~'或其他字符,但請注意,如果您需要表達式部分中的字符,則需要將其轉義。

在字符類中,\s表示任何空格字符。因此'/[^a-zA-Z0-9\\s]/'匹配集合A-Z,a-z,0-9和空格字符中的一個字符而不是'~[^A-Za-z0-9_]~'匹配集合A-Z,a-z,0-9和下劃線('_')中的一個字符而不是

滿足您的要求的一個模式字符串是'~[^A-Za-z0-9_]+~s'

<?php 
$str = <<<STR 
test_ 

one 

two Three 45 
STR; 

echo preg_replace('~[^A-Za-z0-9_]+~s', '', $str); 

,輸出:

 
test_onetwoThree45 

http://codepad.org/Ycl1WvR8

+0

RegEx末尾的'+〜s'到底做了什麼? – SoLoGHoST

+0

@SoLoGHoST:正則表達式是'[^ A-Za-z0-9 _] +'。 '+'的意思是「匹配前一件事貪婪一次或多次」。在這種情況下,「以前的事物」是否定類'[^ A-Za-z0-9_]'。 's'是一個修飾符。這意味着「[表達式]中的點元字符匹配所有字符,包括換行符」。在這種情況下沒有必要,因爲否定類總是包含換行符(除非\ n已列出)。不過,如果我想要一個正則表達式匹配多行文本以防止後來出現問題時,我喜歡將它包括在內,如果將其更改爲包含'.'元字符。 –

2

您正則表達式內的^意味着不...這是

[^a-zA-Z0-9] 

表示該字符串沒有az,AZ和0-9,所以如果要替換不在這些範圍內的所有字符(包括'_'),則必須使用以下語句:

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