2010-02-14 12 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

相关问题