有点惊讶,但以下......
static public function VerifyAndFormatStreet(&$addrStr, $mustExist)
{
if( $addrStr !== NULL )
{
$addrStr = trim($addrStr);
// SNIP
if( preg_match('/[^A-Za-z0-9 -.,]/', $addrStr) )
{
printf("\t### FAIL: BAD CHARS\n");
throw new JEH_IllegalParameterException("Address contains illegal characters");
}
$addrStr = ucwords(strtolower($addrStr));
printf("PASS STRING IS NOW $addrStr\n");
}
else if($mustExist)
throw new JEH_IllegalParameterException("Address must not be empty");
}
以下调用无法在$street2
...
$pass = FALSE;
try { JEH_Address::Create("12 Somestreet", "Junk£", "Frlington", "", "Portsmouth", "Hampshire", "UK", "PO1 1XX"); }
catch(JEH_IllegalParameterException $e) { $pass = TRUE; }
if( !$pass ) die("Was able to detect bad char!!!\n");
else printf("PASS\n");
但如果我在preg_match()
函数中将Create()
函数更改为以下内容...
(将空间放在集合的末尾)
if( preg_match('/[^A-Za-z0-9-., ]/', $addrStr) )
该功能有效。
知道为什么在字符匹配集中移动空格有效吗?
答案 0 :(得分:5)
A-Za-z0-9 -.,
包含四个范围
如果将空间移动到数组的末尾,则最后一个变为
0-9-.
这不是有效范围,因此短划线被视为破折号,而不是范围的一部分。
答案 1 :(得分:4)
你需要逃避破折号,否则你将创建一个与A-Z
类似的范围。因此,您创建了一个从空格到.
的范围来匹配。 (您必须在字符表中查找它们才能看到它们。)尝试:
/[^A-Za-z0-9\-., ]/