2011-06-20 54 views
2

我想替換字符串的非字母數字字符送入太空。正則表達式 - 的preg_replace串

我用 $title= preg_replace("/[^a-zA-Z0-9\s]/", " ", $title);

所以當用戶輸入

ABC!?d $

這將是

ABC d

但怎麼一回事,因爲它的用戶輸入到一個文本輸入它去「x.php?標題= ABC!?d $」。 我希望它去 「x.php?標題= ABC + d」 因爲我想 「ABC d」, 「ABC $$$$$$$$$ d」, 「ABC __!D」 等來去相同的網址。 我如何管理這個。謝謝。

回答

6

基本上,你的意思是,如果旁邊還有對方不止一個替代的角色,那麼你只需要放一個空格字符那裏。是對的嗎?

在這種情況下,是的,這很簡單:你只需要簡單的字符類後添加一個加號,正則表達式,像這樣:

$title = preg_replace("/[^a-zA-Z0-9\s]+/", " ", $title); 

加號告訴正則表達式來尋找一個或多個前一項的匹配。

希望有所幫助。

+0

在Javascript中,你需要你的正則表達式後'g'修改。 PHP似乎並不需要'preg_replace()';給出的答案取代所有的事件。如果你只是在做匹配,PHP有兩個功能:'的preg_match()'和'preg_match_all()'。 – Spudley

+0

謝謝@Spudley。如果我沒有刪除我的評論,那麼這個迴應會很有意義!出於興趣,下面的答案中的方法是否也適用於PHP。 (即使用'\ W'而不是'/ [^ a-zA-Z0-9 \ s] + /')。我試圖學習正則表達式,其中一部分就是理解方言之間的差異。 –

+0

@James:'\ W'是接近的,但對於這個特定的情況是不正確的,因爲它包含OP不想要的下劃線。 – Spudley

0

要擺脫掉不想要的字符使用下面的代碼:

$_GET['title'] = 'abc__.!d'; 

$title = preg_replace('/[^a-zA-Z0-9\s]+/', ' ', $_GET['title']); // "abc d" 

現在,只需重定向到正確的URL(如果需要)

if ($_GET['title'] != $title) { 
    header('Location: ....'); 
    die('Redirect to ...URL...'); 
} 
0

您是否嘗試過\W開關匹配的非APLHA字符? (與+一起)

$title= preg_replace(/\W+/g, " ", $title); 

(在JavaScript中,你還需要/g標誌爲好,不知道這是PHP真)

編輯:

要求國家所有_應該被淘汰,所以下面的工作。

(\W|_)+ 

然而,可能是最好的規定,你想要的確切字符在這種情況下,而不是試圖建立一個排除列表,我的asnwer開始做。

+0

事實證明,這是行不通的,因爲下劃線包含是一個要求。儘管如此,我認爲我會把它留給子孫後代,因爲我認爲它仍然相關。 –