2010-03-01 200 views
1

我有這個PHP正則表達式:正則表達式的字母數字

$username = preg_replace('/[^a-z0-9]/i', '', $username); 

它只允許A-Z0-9。我怎樣才能允許.,-_

+2

你可能會發現http://www.regular-expressions.info/index.html有用。 – jasonbar 2010-03-01 09:48:41

+1

我真的建議你閱讀一些正則表達式的介紹。這裏有很多教程,例如一個jasonbar鏈接到。不要誤會我的意思,你可以在這裏提問,這很好,但是你應該先嚐試自己解決問題。 – 2010-03-01 09:55:28

回答

1
$username = preg_replace('/[^a-z0-9._-]/i', '', $username); 

移除任何不在組中的字符的[^])之一。注意hypern是那裏的最後一個,所以它失去了它的特殊含義。

+0

我一直認爲連字符只是在字母或數字之間的意思,'$ username = preg_replace('/[^_-.]/ i','',$ username);'do? – 2010-03-01 09:41:12

+0

它會介意**'_'和'.'之間的字符**,這很奇怪。 – Kobi 2010-03-01 09:42:14

+0

有趣 - 大概所有字符的小數值在95('_')和46('.')之間?不知道這是否等同於'.- _'。 – 2010-03-01 09:43:53

1

如果你確切地知道你需要匹配什麼,只需在一個字符組中指定它即可。破折號或者需要在開始或結束。

/[A-Z0-9._-]/ 
+1

在被刪除的答案中,你說逃脫DOT會導致反斜槓也被匹配,這是不正確的。嘗試一下:'preg_match_all('/[\.]/','。\\',$ matches); print_r($ matches);'添加一個反斜槓什麼也不做,它只會匹配字符類中的文字DOT。 – 2010-03-01 09:45:09

+2

由於preg_replace()正在被使用,他們需要否定這一點。 – jasonbar 2010-03-01 09:49:44

1
$username = preg_replace('/[^a-z0-9._-]/i', '', $username); 

您當前的代碼實際上確實允許雙方A-Za-z - 在i標誌,標誌着你的正則表達式不區分大小寫。

9

您可以使用以下正則表達式:

/[^a-z0-9._-]/i 
  • 我在最後是使圖案 匹配不區分大小寫。您可以 拖放及用途:/[^a-zA-Z0-9._-]/
  • - (連字符)在字符類中的特殊意義,如果它在兩個 包圍片面,所以我們把它放在末尾,以便 其字面處理。你也可以做 :/[^a-z0-9.\-_]/我們在哪裏 逃避連字符
  • 在字符類A點不是元 字符因此將被從字面上 處理,不需要進行轉義。
+0

+1 from me - 迄今爲止最完整的答案。 – 2010-03-01 09:46:16

+2

這也需要否定.. preg_replace()和所有.. – jasonbar 2010-03-01 09:53:13

+0

{「@」:「codaddict」,「msg」:「沒問題。」}呃呃呃... – jasonbar 2010-03-01 10:00:14

0
$username = preg_replace('/[^a-z0-9._-]/i', '', $username); 
0

嘗試

$username = preg_replace('/[^a-z0-9.-_]/i', '', $username); 
+0

您需要將最後一個連字符轉義爲:。\ -_ – codaddict 2010-03-02 03:10:20

1

非常容易,只要這些字符添加到正則表達式以及

$username = preg_replace('/[^a-zA-Z0-9._-]/','',$username) 

的。因爲它的'matchall'特性,它最終會因爲否則會被用來定義一個範圍(我們當然可以逃脫它)而需要逃脫。

+0

'.'不需要在字符組內部轉義。 – 2010-03-01 09:41:59

+0

我不知道,謝謝。 – 2010-03-01 10:36:16

相關問題