2011-07-01 89 views
1

對於格式的內容:替換一切從行開始等號

KEY=VALUE 

,如:

LISTEN=I am listening. 

我需要做一些使用正則表達式替換。我希望這個正則表達式在=之前用$ key替換任何東西(使它必須從行首開始,所以像'EN'這樣的關鍵字不會替換「TOKEN」之類的關鍵字)

以下是我正在使用的,但它似乎並沒有工作:

$content = preg_replace('~^'.$key.'\s?=[^\n$]+~iu',$newKey,$content); 
+0

'似乎什麼並不work'?什麼是'$ key','$ newKey'和'$ content'?你能舉一些例子嗎? – Toto

回答

1
$content = "foo=one\n" 
     . "bar=two\n" 
     . "baz=three\n"; 

$keys = array(
    'foo' => 'newFoo', 
    'bar' => 'newBar', 
    'baz' => 'newBaz', 
); 
foreach ($keys as $oldKey => $newKey) { 
    $oldKey = preg_quote($oldKey, '#'); 
    $content = preg_replace("#^{$oldKey}(?=)#m", "{$newKey}\\1", $content); 
} 

echo $content; 

輸出:

newFoo=one 
newBar=two 
newBaz=three 
1
$str = 'LISTEN=I am listening.'; 
$new_key = 'ÉCOUTER'; 

echo preg_replace('/^[^=]*=/', $new_key . '=', $str); 
0
$content = 'LISTEN=I am listening.'; 
$key = 'LISTEN'; 
$newKey = 'NEW'; 


$content = preg_replace('~^'.$key.'(\s?=)~iu',$newKey.'$1',$content); 

echo $content; 

輸出NEW=I am listening.

不過是部分匹配不改變

$content = 'LISTEN=I am listening.'; 
$key = 'TEN'; 
$new_key = 'NEW'; 

$content = preg_replace('~^'.$key.'(\s?=)~iu',$newKey.'$1',$content); 

echo $content; 

輸出爲LISTEN=I am listening.

+0

解析錯誤:語法錯誤,意外的T_LNUMBER,期待T_VARIABLE或'$' – binaryLV

+0

@binaryLV - 謝謝,修復並添加了測試結果:) – cordsen

0

這應該做的伎倆。 \ A是一行的開始,括號用於將事物分組以保留/替換。

$new_content = preg_replace("/\A(.*)(=.*)/", "$key$2", $content); 
1

如果我明白你的問題很好,你需要切換多行模式使用m修改。

$content = preg_replace('/^'.preg_quote($key, '/').'(?=\s?=)/ium', $newKey, $content); 

通過我不建議使用preg_quote,以避免意外的結果,以逃避$key的方式。

因此,如果源內容是這樣的:

KEY1=VALUE1 
HELLO=WORLD 
KEY3=VALUE3 

結果將是(如果$key=HELLO$newKey=BYE):

KEY1=VALUE1 
BYE=WORLD 
KEY3=VALUE3