我想在已经接受所有数字,下划线,句号和字母数字字符的验证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>");
?>
答案 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中删除它。