1

特定の単語のダッシュ/ハイフン ("-") をスペース (" ") で選択して置き換えたい (例: "start-down" が "start down" に変わる) 一方で、他の単語の置換を無視します (例: PHP の preg_replace() を使用すると、「スタートアップ」は「スタートアップ」のままです)。

これは私が思いついた正規表現です:

(?<!(start))-(?!(up))|(?<!(start))-|-(?!(up))

このデータに対して上記の正規表現を使用すると、次のようになります。

  1. 起動
  2. 開始
  3. なんでも
  4. 途中下車する
  5. 開始
  6. ストップアップ

以下を返します。

  1. 起動
  2. スタート
  3. 何もかも
  4. 途中下車する
  5. 始める
  6. 立ち止まる

スタートアップに最適です。しかし、途中で停止などの他の例外をリストに追加する必要があることはわかっています(例:「停止」は「停止」のままです)。

したがって、問題は次のとおりです。str_replace() などの PHP の関数を介して実行する必要があります。else/switch が「変更不可能な」単語の配列を使用している場合は、それらをループして、必要に応じて適切な変更を行うか、正規表現に方法があります。選択が特定の単語の一部である場合、選択を無視するには?

4

2 に答える 2

3

私のphpは少しさびていますが、ここに私が提案するものがあります:

function do_replace($m) {
    return strlen($m[1]) > 0 ? $m[1] : ' ';
}

preg_replace_callback('/(start-up|stop-off)|-/', 'do_replace', $input);

PHP のバージョンが無名関数をサポートしている場合は、次のようにできます。

preg_replace_callback(
    '/(start-up|stop-off)|-/',
    function($m) {
        return strlen($m[1]) > 0 ? $m[1] : ' ';
    },
    $input
);

この方法の本当の利点は、除外したい「特別な単語」をいくつでも簡単に拡張できることです。

于 2013-06-26T17:16:06.867 に答える
1

\Kpreg_replace でパターン リセット ( ) トリックを使用できます。例:

$input = 'passe-montagne, passe-partout, passe-murail, start-up, stop-off';

echo preg_replace('~\b(?>start-up|stop-off)\b\K|-~', ' ', $input);

それ以前のもの\Kはすべてチェックされますが、試合結果から除外されます。

注意: この種のトリックを使用すると、パターンをより効率的にすることができます。

~\bst(?>art-up|op-off)\b\K|-~
于 2013-06-26T17:26:57.727 に答える