0

私はまだ以下の一連のルールに非常に苦労しています。

規則: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'] )
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桁以上の数字が含まれている場合、 最初の正規表現である、が一致します。

2番目の式は、文字列に6文字以上が含まれ、すべてが数字である場合に一致します。ただし、2番目の文字の後にGGが2桁の代わりに1回表示される場合があります。

3番目の式は、文字列に6文字以上が含まれている場合に一致します。ただし、3番目の文字であるDまたはNを除き、すべてが数字であり、3番目の文字の後にGGが2桁の代わりに1回表示される場合があります。

文字列がどちらの式にも一致しない場合、置換は行われません。

$replacements配列項目では、最初のキャプチャグループ、 2番目、および3番目$1の数字を指します。$2$3

に渡す前に、入力から空白を削除することをお勧めしますpreg_replace

于 2013-02-01T11:30:17.407 に答える