0

我仍在为以下这些规则而苦苦挣扎。

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

ID 将被重新格式化如下: 如果所有数字,在第二个数字后插入空格(例如,67 00488780011) 如果第三个字符是 D 或 N,第二个数字后没有空格(例如,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、用户还可以通过5位邮政编码和地址进行搜索,例如123 Gregory drive。使用上述代码重新格式化后,用户将无法再使用地址或邮政编码进行搜索。

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

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

$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'] )
4

1 回答 1

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'] );

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

如果字符串包含 6 个或更多字符且所有字符都是数字,则第二个表达式将匹配,但在第二个字符之后 GG 可能会出现一次而不是两个数字。

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

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

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

在将输入传递给preg_replace.

于 2013-02-01T11:30:17.407 回答