2013-06-26 26 views
1

我想選擇並用空格替換破折號(「 - 」)某些單詞(例如:「啓動」改爲「啓動」),而使用PHP的preg_replace()忽略替換其他單詞(例如:「啓動」保持「啓動」)。正則表達式選擇一個( - ),但忽略選擇,如果它在某些單詞內(啓動|停止)

這是我想出正則表達式:

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

使用這個數據的上述正則表達式:

  1. 初創
  2. 起步
  3. 任何行動
  4. STOP-OFF
  5. 啓動關閉
  6. 停止了

返回如下:

  1. 初創
  2. 開始下降
  3. 任何東西
  4. 下車
  5. 開始

它完美地開辦。但我知道,我需要在列表中加入其他例外,例如停止(例如:「停止」停留「停止」)。我是否應該通過PHP的函數(如str_replace())和if else/switch case來處理帶有「不可更改」單詞的數組,並在必要時進行適當的更改,或者是有一種方法在正則表達式中忽略某些選擇,如果選擇是在某個單詞中的一部分?

+0

這是要上一個大的字符串文本或單詞的任何陣列使用? –

+0

它將用於像列表這樣的單詞,最多不超過3-4個單詞。 – haleksandre

回答

1

您可以使用該模式復位(\K)招用了preg_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|-~ 
+0

謝謝,這是完美的工作! – haleksandre

+0

似乎'\ K'不被.NET(我目前的主要平臺)支持,並且最近才被添加到PHP中。 +1今天我學到了一些新東西。 –

+0

@ p.s.w.g:indead,你可以在perl中找到它,但是據我所知,在ruby或python中不可以。 –

3

我的PHP是一個有點生疏,但這裏是我建議:

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

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

如果您的PHP版本支持anonymous functions,你可以這樣做:

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

的真正好處這種方法是很容易擴展到任何你想排除的'特殊詞'。

+0

謝謝,我還沒有想過要做一個preg_replace_callback()。但是我會和Casimir et Hippolyte一起回答,因爲它會在我的應用程序中更容易實現。 – haleksandre

+0

@haleks沒問題。快樂編碼:) –

相關問題