如何在PHP Regex类中使用方括号?

时间:2010-02-14 17:52:26

标签: php regex

我想在已经接受所有数字,下划线,句号和字母数字字符的验证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, "p@trick")?"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>");
?>

5 个答案:

答案 0 :(得分:3)

前者应该有效。您需要使用两个反斜杠:一个用于正则表达式转义,另一个用于字符串转义。只需看看它是如何评估的:

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分开。

答案 1 :(得分:1)

如果它在双引号内,则需要转义$

例如:

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

答案 2 :(得分:1)

不是一个答案,但是一个有用的提示:在正则表达式周围使用单引号(如果它们不需要php解析),因此您不必进行额外的转义层。只有一个引号需要在单引号字符串中进行转义。 (php strings)

此外,ereg系列函数为on its way out。为什么不使用preg_match,在结束斜杠后加上'i'来表示不区分大小写的匹配?

答案 3 :(得分:0)

使用ereg函数时,无法转义括号表达式中的字符。请改用此模式:

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

您可以通过阅读regex man page中的括号表达式部分来理解其工作原理。

无论如何,最好只切换到PCRE functions,因为eregi现在已在PHP 5.3中弃用。

答案 4 :(得分:0)

在括号内转义不适用于ereg(它将\视为文字字符)。 ']'应始终作为第一个字符放在括号中,'['可以放在其他地方:

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

但是你最好迁移到preg_match,因为在PHP 5.3中不推荐使用ereg,并且将在PHP6中删除它。