0

下面的代码遵循正则表达式中定义的规则。

  1. 如果 ID 全部为数字,则在前 2 位数字后插入一个空格。
  2. 如果 ID 在前 2 位数字之后有一个字符并且没​​有其他字符,则没有变化。
  3. 如果 ID 有数字和字符,并且字符在数字中的任何位置都是 GG,则在 GG 之前插入 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 回答