2010-02-14 11 views
0

我想添加[和]在我的驗證正則表達式中已經接受所有數字,下劃線,句點和字母數字字符。如何在PHP Regex類中使用方括號?

這裏是正則表達式的工作: $ regex =「^ [._ a-zA-Z0-9 - ] * $」;

但是當我嘗試:

$regex = "^[.\\[\\]_a-zA-Z0-9-]*$"; 

$regex = "^[.\[\]_a-zA-Z0-9-]*$"; 

它不工作,(我在PHP讀取雙逃逸支架,但它不工作

我使用eregi

任何想法?

測試:

<?php 
//$regex = "^[_a-zA-Z0-9-]*$"; 
$regex = "^[.\\[\\]_a-zA-Z0-9-]*$"; 
echo("1".(eregi($regex, "patrick")?"True":"False"));//Should return True 
echo("<br>"); 
echo("2".(eregi($regex, "[email protected]")?"True":"False")); 
echo("<br>"); 
echo("3".(eregi($regex, "pat rick")?"True":"False")); 
echo("<br>"); 
echo("4".(eregi($regex, "patr'ick")?"True":"False")); 
echo("<br>"); 
echo("5".(eregi($regex, "pAtr'ick")?"True":"False")); 
echo("<br>"); 
echo("6".(eregi($regex, "pAtr_ick")?"True":"False"));//Should return True 
echo("<br>"); 
echo("7".(eregi($regex, "pA-tr_ick")?"True":"False"));//Should return True 
echo("<br>"); 
echo("8".(eregi($regex, "pAaAta atrack")?"True":"False")); 
echo("<br>"); 
echo("9".(eregi($regex, "pA%k")?"True":"False")); 
echo("<br>"); 
echo("10".(eregi($regex, "patrick.second")?"True":"False")); //Should return True 
echo("<br>"); 
echo("11".(eregi($regex, "[Pat]Rick")?"True":"False"));//Should return True 
echo("<br>"); 
?> 
+0

不要使用eregi,因爲它正從PHP內核中刪除。 – 2010-02-14 18:16:14

回答

2

前者應該工作。您需要使用兩個反斜槓:一個用於正則表達式轉義,另一個用於字符串轉義。只要看看它如何得到評估:

echo "^[.\\[\\]_a-zA-Z0-9-]*$"; // => ^[.\[\]_a-zA-Z0-9-]*$ 

這正是你所需要的。


編輯使用preg_match代替:

preg_match("/^[.\\[\\]_a-zA-Z0-9-]*$/i", $str) 

我不知道爲什麼這個正則表達式不eregi工作,但它確實preg_match。此外,POSIX ERE functions已被棄用,並將被PHP 6刪除,以支持PCRE functions。請注意,PCRE正則表達式使用delimiters來包含正則表達式,並將其與modifiers分開。

+0

不適用於問題中發佈的代碼(我剛剛使用代碼段編輯它) – 2010-02-14 18:00:38

+0

它與preg_match一起使用:$ regex =「/^[\[\]._a-zA-Z0-9-]* $ /「; – 2010-02-14 18:11:37

1

你需要逃避$如果是雙引號內。

例如:

$regex = "^[.\\[\\]_a-zA-Z0-9-]*\$"; 
+1

不適用於問題中發佈的代碼(我只是用一段代碼編輯它) – 2010-02-14 18:03:11

+0

你是對的 - 似乎PHP足夠聰明,可以理解缺少的反斜槓。嘗試使用'preg_match'來代替。 'ereg'已棄用。 – troelskn 2010-02-14 18:06:58

0

不是一個答案,而是一個有用的提示:圍繞你的正則表達式使用單引號(如果它們不需要php解析),所以你不必做額外的轉義層。只有單引號需要在單引號字符串中轉義。 (php strings)

而且,ereg功能家族是on its way out。爲什麼不使用preg_match,在結束斜線後面加上'i'來表示不區分大小寫的匹配?

0

使用ereg函數時,不能在括號表達式中轉義字符。使用這種模式,而不是:

$regex = "^[]._[a-zA-Z0-9-]*$"; 

你可以理解爲什麼它的工作原理是在regex man page閱讀支架表達的部分。

無論如何,最好是切換到PCRE functions而不是,因爲eregi現在已在PHP 5.3中棄用。

0

括號內部的轉義不適用於ereg(它將\視爲字符字符)。 「]」應始終放置在括號中第一個字符和「[」可以是其他任何地方:

$regex = "^[]._[a-zA-Z0-9-]*$"; 

但是你最好遷移到的preg_match,因爲額日格在PHP 5.3棄用,並將在PHP6被刪除。

+0

糟糕! Clément更快:-) – Qwerty 2010-02-14 18:14:31

相關問題