2012-11-19 33 views
0

我正在試驗一個問題| (或)和PHP中的正則表達式。php正則表達式和或(|)

這裏是我想做些什麼,比如我有那些3句:

「蘋果很好吃」

「一天一蘋果,醫生遠離我」

「我最喜歡吃蘋果」

,並讓說,我想改變橙色字蘋果,所以這裏是我的代碼:

$oldWord="apple"; 
$newWord="orange"; 
$text = preg_replace('#^' . $oldWord . ' #', $newWord, $text); 
$text = preg_replace('# ' . $oldWord . ' #', $newWord, $text); 
$text = preg_replace('# ' . $oldWord . '$#', $newWord, $text); 

當然,它的工作原理,但我還沒有找到正確的combinaison做到這一點,只有一行代碼與關鍵字| (要麼)。

你們有什麼建議嗎?謝謝

+2

''當然它的工作原理''? preg_match不會取代任何東西。 – alexn

+0

換句話說,'$ oldWord'可以在任何地方*?爲什麼要使用'^'和'$'呢? – deceze

+4

我猜你正在這樣做,以防止匹配「蘋果」只是一個字的一部分,如在「Snapple」?如果是這樣,你可能需要[字界](http://www.regular-expressions.info/wordboundaries.html):'#\ bapple \ b#' – Wiseguy

回答

0

請注意,你的正則表達式中刪除apple附近的空格。如果這不是你想要什麼,而是你只是想更換apple,如果它是完整的字,那麼,一些人建議,使用單詞邊界:

$text = preg_replace('#\b' . $oldWord . '\b#', $newWord, $text); 

如果沒有意圖把空格去掉也是你可以要求wordboundary,但使空間可選:

$text = preg_replace('#[ ]?\b' . $oldWord . '\b[ ]?#', $newWord, $text); 

如果他們在那裏,他們將被刪除了。如果他們不是,正則表達式不關心。請注意0​​與輸入空格完全等價,但我發現它在正則表達式中更具可讀性。

+1

雖然不會匹配字符串「apple」。這要求它在任何一邊都有空格。 – nickf

+0

@nickf對不起,完全忽略了那些 –

+0

現在它會匹配「菠蘿」,我猜這是OP所不希望的。 – nickf

1

爲什麼不只是str_replace('apple', 'orange', $text);

編輯:

根據註釋來自用戶:

preg_replace('/\bapple\b/', 'orange', $text); 

如果你擔心在表達正確轉義搜索詞:

$oldWord = preg_quote($oldWord, '/'); 
$text = preg_replace("/\b$oldWord\b/", $newWord, $text); 
+0

,因爲我只想刪除'蘋果',如果它是單獨的,例如我不想刪除'anapple' – user1836529

+0

-1這完全不等同。 –

0

只需使用的preg_replace代替preg_match

preg_replace('⁓\b'.$oldWord.'\b⁓', $newWord, $text) 
0

我無法測試,但

$text = preg_match('#\b' . $oldWord . '\b#ig', $newWord, $text); 

Shoudl節約你的時間;)

+2

從評論部分複製/粘貼;-) – PeeHaa

+0

@peeHaa,你知道,我在10分鐘前回答,兩分鐘後發佈的類似評論......你確定我複製了它嗎? – Eineki

+0

謝謝,但我得到了錯誤未知修飾符'g' – user1836529

1

所以,如果你想更換全單詞只有,即單獨留下「菠蘿」,那麼str_replace方法將不起作用。你應該使用的是字邊界定位點\b

preg_replace('#\b' + $oldWord + '\b#', $newWord, $text) 
+0

謝謝我試過了,但是我得到了錯誤解析錯誤:語法錯誤,意外T_ECHO – user1836529

+0

@ user1836529 o_o然後添加一個分號? '$ text = preg_replace('#\ b'+ $ oldWord +'\ b#\,$ newWord,text);' – nickf