0

以下のコードは、正規表現で定義された規則に従います。

  1. ID がすべて数字の場合は、最初の 2 桁の後にスペースを挿入します。
  2. ID の最初の 2 桁の後に文字があり、他の文字がない場合、変更はありません。
  3. ID に数字と文字があり、文字が数字のどこかに GG である場合は、GG の前に 2 つのスペースを挿入します。

以下のコードは、これらのルールを満たしています。

これらのルールは、プロダクション モードでの現在の検索機能を改善することを目的としています。

これらのルールを実装した後に遭遇した問題は 2 つあります。

1、ユーザーは現在の本番アプリで ID、郵便番号、住所で検索し、検索パラメーターが有効な場合に結果を取得できます。

これらのルールを実装すると、郵便番号検索と住所検索が機能しなくなります。

たとえば、ID と同様に、ユーザーが Id で検索した場合、出力される結果は、ユーザーが検索した ID のみです。次に、ユーザーはその ID をクリックします。

郵便番号と同じで、ほとんどの場合、住所は、ユーザーが完全な住所を入力するか、住所の一部を入力するかによって、そのように機能します。この場合、入力された部分に一致する住所が表示されます。

郵便番号と住所は、開発サーバーでこの新しい変更されたバージョンでは機能しません。

モードの後に​​コードが機能しなくなった理由を理解するための支援に永遠に感謝します.

私は正規表現を思いつきましたが、他の誰かがクエリを書きました。

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 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
;

// get current matche
preg_match_all($pattern, $_GET['id'], $matches);

// reformat the match
$str = format($matches);


// query
$tsql = "SELECT *
FROM searchtable AS ST
inner join CONTAINSTABLE(gSearch, Name, '\"$id*\"') AS GT
ON ST.GUID = GT.[KEY]
WHERE GT.RANK > 0
ORDER BY list, Name, GT.RANK DESC";

それが役立つ場合、これらは正規表現が書かれた後に私が行った変更です。

私はこれを現在の製品で動作するように変更しました:

$id= $_GET["id"];

これに:

// get current matche
preg_match_all($pattern, $_GET['id'], $matches);

// reformat the match
$str = format($matches);

私はクエリをいじらなかったので、私の問題は正規表現に関係していると思います。

よろしくお願いします

4

1 に答える 1

0

段階的に行う方が簡単で、賢く、保守しやすいようです。

$search = $_GET['id'];

if (preg_match('/^\d+$/', $search)) { // Only digits
    $search = substr($search, 0, 2).' '.substr($search, 2);
} else if (preg_match('/^\d+?GG\d+?$/', $search)) { // 'GG' between digits
    $search = str_replace('GG', '  GG', $search);
}

// query
$tsql = "SELECT *
FROM searchtable AS ST
inner join CONTAINSTABLE(gSearch, Name, '\"$search*\"') AS GT
ON ST.GUID = GT.[KEY]
WHERE GT.RANK > 0
ORDER BY list, Name, GT.RANK DESC";
于 2013-01-28T22:51:30.663 に答える