2010-06-03 50 views
0

想使用類似:PHP的preg_replace而不EVAL

$newdata = preg_replace($pattern, $replacement, $data); 

現在我的更換是一樣的東西

$pattern = "/START(.*?)END/is"; 
$replacement = "START $config END"; 

現在,$配置包含像

array('Test\\\'s Page') 

問題內容是我寫內容後,$ newdata變成

START array('Test\\'s Page') END 

正如您在上面看到的那樣,單個\因爲它被評估而失蹤。我如何避免這種情況?

+0

\沒有得到評估,問題是在別的地方。 – Progman 2010-06-03 11:27:25

+0

\\\'正在轉換爲\\'。它只是在preg_replace之後。如果我回顯$ replacement和$ newdata .... – 2010-06-03 12:33:30

+0

$ config是一個字符串而不是數組。這些只是內容。 – 2010-06-03 12:35:59

回答

0

這個按預期工作......至少根據manual of preg_replace

要在替換中使用反斜槓,它必須加倍(「\\\\」PHP字符串)。

這是需要的,因爲您可以使用\\n作爲反向引用。如果你不想要回參考,但想要\本身,你需要逃避它。如果你想要3個反斜槓,你必須寫6個反斜槓。

$data = 'Some START END testdata'; 
$config = 'array(\'Test\\\\\\\\\\\\\'s Page\')'; 
$replacement = "START $config END"; 
$pattern = "/START(.*?)END/is"; 
var_dump($data, $config, $replacement, $pattern); 
$newdata = preg_replace($pattern, $replacement, $data); 
var_dump($newdata); 

這將生成以下輸出。

string(23) "Some START END testdata" 
string(26) "array('Test\\\\\\'s Page')" 
string(36) "START array('Test\\\\\\'s Page') END" 
string(17) "/START(.*?)END/is" 
string(47) "Some START array('Test\\\'s Page') END testdata" 
0
$replacement = "START".$config."END" 
0

您是否嘗試將數組展平成一個字符串?

$replacement = sprintf('START %s END', implode('', $config));

編輯:既然你沒提$config是什麼樣子,我們無法給出一個確切的答案。

+0

我已經提到它的樣子。 – 2010-06-03 12:29:10

+0

@Alec Smart:好的,在這種情況下,我的解決方案應該可以工作。 – janmoesen 2010-06-04 09:00:31