0

有点惊讶,但以下...

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) )

该功能有效。

知道为什么在字符匹配集中移动空间有效吗?

4

2 回答 2

5

A-Za-z0-9 -.,包括四个范围

  1. 从头到尾
  2. 从头到尾
  3. 0 到 9
  4. [空格] 到 ,

如果将空间移动到数组的末尾,则最后一个变为

0-9-.

这不是有效范围,因此破折号被视为破折号,而不是范围的一部分。

于 2013-05-14T18:56:59.223 回答
4

您需要转义破折号,否则您将创建一个范围,就像使用A-Z. 所以你创建了一个从空间.到匹配的范围。(您必须在字符表中查找它以查看它们是什么。)尝试:

/[^A-Za-z0-9\-., ]/
于 2013-05-14T18:57:27.757 回答