私はまだ以下の一連のルールに非常に苦労しています。
規則:6文字以上の検索テキストは、次のいずれかに該当する場合にIDとして解釈されます。すべての文字が数字、または3番目の文字(DまたはN)を除くすべての数字、または3番目を除くすべての数字GGである10番目と11番目の文字を除く文字DまたはNである3番目の文字を除くすべての桁、およびGGである10番目と11番目の文字を除く文字
IDは次のように再フォーマットされます。すべての数字の場合、2番目の数字の後にスペースが挿入されます(例:67 00488780011)3番目の文字がDまたはNの場合、2番目の数字の後にスペースはありません(例:14N00339902009)10番目と11番目の文字がGGの場合、2つのスペースGGの前(例:14 8725 GG0544)3番目の文字がDまたはNで、10番目と11番目の文字がGGの場合、2桁目の後にスペースはなく、GGの前に2つのスペースがあります(例: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がそのうちの1つになります。2、ユーザーは、123Gregoryドライブなどの5桁の郵便番号と住所で検索することもできます。上記のコードで再編成した後、ユーザーは住所または郵便番号で検索できなくなります。
コードに間違いなく何かが間違っていますが、私はそれを理解できないようです。
何卒よろしくお願い申し上げます。
$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'] )