您能否帮助修改此代码以允许地址和邮政编码搜索?

时间:2013-01-31 18:26:22

标签: php regex

我仍在努力应对以下这些规则。

规则:如果满足下列条件之一,则任何包含6个或更多字符的搜索文本将被解释为ID:  所有字符都是数字,或  除第三个字符以外的所有数字,即D或N,或  除了第10个和第11个字符(GG)以外的所有数字,除了第三个字符  除第三个字符以外的所有数字,即D或N,除了GG的第10个和第11个字符

ID将重新格式化如下:  如果所有数字,在第二位数后插入空格(例如,67 00488780011)  如果第3个字符是D或N,则在第2个数字后没有空格(例如,14N00339902009)  如果第10个和第11个字符是GG,则在GG之前有两个空格(例如,14 8725 GG0544)  如果第3个字符是D或N且第10个和第11个字符是GG,则在第2个数字之后没有空格但在GG之前没有空格(例如,14N0156 GG0390)

这是我到目前为止的代码。

function format($matches)
{
    return $matches[1][0].(strlen($matches[2][0])>0?$matches[2][0]:" ").$matches[3][0].(strlen($matches[4][0])>0?"  ".$matches[4][0]:"");
}

// CONSTRUCT A REGULAR EXPRESSION
$pattern
= '/'         // regex delimiter
. '('         // START of a capture group
. '\d{2}'     // exactly two digits
. ')'         // END of capture group
. '('         // START SECOND capture group
. '[\sND]?'     // letters "D" OR "N" in any order or number - This is optional
. ')'         // END SECOND capture group
. '('         // START THIRD capture group
. '\d*'       // any number of digits
. ')'         // END THIRD capture group
. '('         // START FOURTH capture group
. 'GG'        // the letters "GG" EXACTLY
. '[\d]*'     // any number of digits
. ')'         // END THIRD capture group
. '?'         // make the LAST capture group OPTIONAL
. '/'         // regex delimiter
;

// create an array of matches
preg_match_all($pattern, $_GET['id'], $matches);

// REFORMAT the array
$id = format($matches);

现在,我需要的是将$ id添加到我的查询中作为搜索过滤器。

这应该起作用的方式是你在搜索框中输入一个ID,点击GO。如果该ID有效,则应根据上述规则重新格式化ID并将其显示为链接。

我上面的正则表达式确实重新格式正常但有一些我无法解决的问题。

1,如果代码工作正常,则每次搜索只能显示ID。但是,搜索会产生多个ID,而您搜索的ID恰好是其中之一。 2,用户还可以通过5digit邮政编码和123格雷戈里驱动器等地址进行搜索。使用上面的代码重新格式化后,用户将无法再使用地址或邮政编码进行搜索。

代码肯定有问题,但我似乎无法弄明白。

提前感谢您对我的耐心和帮助。

$patterns = array(
    '/^(\d\d)(\d{4,})$/',
    '/^(?=.{6,}$)(\d\d[\dDN]\d*)(GG\d*)$/'
);

$replacements = array( '$1 $2', '$1  $2' );

$_GET['id'] = $id;

$id = preg_replace( $patterns, $replacements, $_GET['id'] )

1 个答案:

答案 0 :(得分:0)

更新了以下评论反馈:

以下将执行所需的替换,据我所知:

$patterns = array(
    '/^(\d\d)(\d{4,})$/',
    '/^(?=.{6,}$)(\d\d)(\d*)(GG\d*)$/',
    '/^(?=.{6,}$)(\d\d[DN]\d*)(GG\d*)$/'
); 

$replacements = array( '$1 $2', '$1 $2  $3', '$1  $2' );    

$id = preg_replace( $patterns, $replacements, $_GET['id'] );

如果字符串包含6位或更多位,则第一个正则表达式/^(\d\d)(\d{4,})$/将匹配。

如果字符串包含6个或更多字符,其中所有字符都是数字,则第二个表达式将匹配,除了在第二个字符GG可能出现一次代替两个数字之后。

如果字符串包含6个或更多字符,则第三个表达式将匹配,其中除了第三个字符D或N之外,所有字符都是数字,并且在第三个字符GG可能出现一次代替两个数字之后。

如果字符串与任一表达式都不匹配,则不进行替换。

$replacements数组项中,$1指的是第一个捕获组中的数字,$2指向第二个捕获组,$3指的是第三个捕获组。

您可能希望在将空格传递给preg_replace之前修剪输入空格。