我仍在努力应对以下这些规则。
规则:如果满足下列条件之一,则任何包含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'] )
答案 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
之前修剪输入空格。