1

私はこの答えを見つけました --https://stackoverflow.com/a/7943464/1901367-これは私に引用符と空白を含む検索文字列を解析することを可能にするこの本当に便利なコードを与えました。

preg_match_all('/(?<!")\b\w+\b|(?<=")\b[^"]+/', $subject, $result, PREG_PATTERN_ORDER);

現在のコードでは+や-などのブール演算子が削除されるため、このコードを変更して+や-などのブール演算子をそのまま残す方法を誰かに教えてもらえないかと思いました。

これらの演算子を使用してデータベースの全文ブール検索を実行したいのですが、理解できないこの正規表現に混乱しています。

入力と出力の例。

入力:'"this is some" text is -more-"exlude me"'出力:[this is some] [text] [here] [is] [-more][-excludeme]これらは$に含まれます結果の配列

したがって、スペースで区切られたものはすべて、「」で囲まれたフレーズでない限り、個別のアイテムです。これはすでに機能しますが、-moreと-"exlude me"がある場合、現在の結果は[more]と[exclude me]になり、保持したいマイナス記号が失われます。

前もって感謝します!

4

2 に答える 2

1

単純な正規表現を使用して、引用符とその中のすべてを含むトークンをヤンクアウトし、使用する前にそれらをきれいにすることができます。このようなもの:

function query_tokens($query)
{
    $regex = '/-?"[\pL\s]+"|-?\pL+/';

    preg_match_all($regex, $query, $tokens, PREG_SET_ORDER);

    foreach ($tokens as & $token)
    {
        $token = array_shift($token);

        $modifier = NULL;

        if ($token[0] === '-' || $token[0] === '+')
        {
            $modifier = $token[0];

            $token = substr($token, 1);
        }
        if ($token[0] === '"')
        {
            $token = trim($token, '"');
        }
        $token = $modifier.$token;
    }

    return $tokens;
}

使用される文字列と関数の結果:

var_dump(query_tokens('"this is some" text here is -more -"exlude me"'));
array (size=6)
  0 => string 'this is some' (length=12)
  1 => string 'text' (length=4)
  2 => string 'here' (length=4)
  3 => string 'is' (length=2)
  4 => string '-more' (length=5)
  5 => string '-exlude me' (length=10)

正規表現は素晴らしいですが、必要以上に複雑になる場合があります。

于 2012-12-16T23:48:29.703 に答える
1

一致は常に連続しているため、正規表現を使用して「-exclude me」をキャプチャすることはできません。せいぜい、次のように「-more」トークンに一致するように正規表現を変更できます。

(?<!")-?\b\w+\b|(?<=")\b[^"]+

于 2012-12-17T01:09:45.220 に答える