我仍在为以下这些规则而苦苦挣扎。
规则:如果满足以下条件之一,任何 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'] )