1

サードパーティのインデックス検索サービスのブール検索文字列があります。Germany or (Indian, Tech*)

処理後の結果が必要です: Germany[45] or (Indian[45], Tech*[45])。ここで、45 は検索サービスが必要とする重みです。

長い間グーグルで調べた後、結果を得ることができました: Germany[45] or (Indian[45], Tech[45]*). ここでは、必要ではない*後に来ていることがわかります。[45]

出力は次のようになります: beforeGermany[45] or (Indian[45], Tech*[45])を探します。*[45]

コード:

preg_replace('/([a-z0-9\*\.])+(\b(?<!or|and|not))/i', '$0'."[45]", $term);

したがって、その背後にある単純な概念は、単語に重みを適用することですが、or/and/notブール検索のセンシティブな単語には適用しません。正規表現を微調整するか、必要な結果を得るために新しい正規表現を与えるのを手伝ってください。

4

2 に答える 2

3

\b問題は、単語境界を含む一致しか得られないことでした。アスタリスクは単語以外の文字であるため、一致から除外されていたため、解決策は単語の境界またはアスタリスクのいずれかを許可することでした(\*|\b):

preg_replace('/([a-z0-9.]+)((\*|\b)(?<!or|and|not))/i', '$0'."[45]", $term);

ただし、否定的な先読みを使用する方が簡単です。

preg_replace('/\b(?!or|and|not)([a-z0-9*.]+)/i', '$0'."[45]", $term);

注: 文字クラス内では、アスタリスクとピリオドはメタ文字ではないため、元の式のようにエスケープする必要はありません: [a-z0-9\*\.]+.

于 2013-08-14T12:29:59.517 に答える