2015-12-29 58 views
-1

我有一個文本文件,如下所示:如何用str_replace()替換一個詞,僅當它不是另一個詞的一部分?

yyy.txt:

line1      
line2      
line3line4  
line5line3  
line3 

現在我想在下面的代碼555更換line3。但是,如果line3不是另一個單詞的一部分,我只想替換該行,例如XYline3line3XY

我試着用這個代碼來實現:

$filename="yyy.txt"; 
$line="line3"; 

file_put_contents($filename, str_replace($line , "555", file_get_contents($filename))); 

輸出:

line1 

line2 

555line4 

line5555 

555 

正如你可以在這裏看到它也換成line3line4line5line3即使我不想這樣。

那麼,如何更改我目前的代碼,它只會替換搜索詞,如果它不是另一個詞的一部分?我有點卡在這裏,不知道這是可能的str_replace()或如果我必須以另一種方式做到這一點。

+1

你需要使用正則表達式或更具體的'search'字符串。 – chris85

+0

你的問題的格式非常分散。請格式化並澄清您的具體問題。 – chris85

+0

請勿多次發佈相同或接近相同的問題。 –

回答

4

使用preg_replace

$line="/\bline3\b/";  
file_put_contents($filename, preg_replace($line , "555", file_get_contents($filename))); 

這將替換所有單詞在句子中,匹​​配line3

正好相匹配,使用方法:/^line3$/m

+0

\ b是字邊界......所以如果一行有「foo line3 bar」,上面的正則表達式會導致「foo 555 bar」 – BareNakedCoder

+0

@BareNakedCoder更新! – Thamilan

+1

錯字錯誤!已修復 – Thamilan

0
file_put_contents($filename, preg_replace(
    "/^line3\s*$/gm" , 
    "555", 
    file_get_contents($filename) 
)); 

在正規快件,^比賽開始線,line3比賽,好了,3號線,\s*匹配零個或多個空格/製表符和$比賽隊伍的盡頭。開關gm表示處理所有匹配並將字符串視爲多行。

+0

PHP中沒有'g'修飾符。 'preg_replace'默認是全局的。 – chris85

0

首先,你的數據應該是更清潔,你的問題應該更有組織,不管怎麼說,

  1. 打開你的文本文件,並確保t處有一個RC字符他在每行的結尾,你會通過點擊輸入在每行的末尾 完成。
  2. 使用下面的腳本:

    $filename="yyy.txt"; 
    $content = file_get_contents($filename); 
    $content = preg_replace ('/(\r)+line3(\r)+/', "\r555\r" , $content); 
    $content = preg_replace ('/(\n)+line3(\n)+/', "\n555\n" , $content); 
    file_put_contents($filename, preg_replace ('/(\s)+line3(\s)+/', "\s555\s" , $content)); 
    
+0

爲什麼要有3個正則表達式? '\ s'會發現'\ n'和'\ r'也沒有理由對它們進行分組,我沒有看到在替換字符串中使用'\ r'的原因,可能是'\ n'。 – chris85

+0

確保正確的行爲,無論是隱藏的字符。請注意,傳遞的數據不乾淨,行之間的字符將是任何東西! –

+0

'\ s'是任何空格字符......'\ s代表「空白字符」。再一次,這實際包含哪些字符取決於正則表達式的風格。在本教程討論的所有風格中,它都包含[\ t \ r \ n \ f]。即:\ s匹配空格,製表符,換行符或換頁符.'- http://www.regular-expressions.info/shorthand.html也不需要分組。 – chris85

相關問題