2014-11-02 28 views
2

我只是做一個升級腳本替換所有鏌鋣片段標記爲較新的格式preg_replace_all (當然,123 - 這是一個例子 - 有很多不同的數字)如何在大數據量

此外,我想要替換所有自定義片段到一個新的:

老摘錄格式:

[!MySnippetName? &param1=`value1` &param2=`value2` !] 

新:

[[!MySnippetName? &param1=`value1` &param2=`value2` ]] 

(當然,&param1=value1 &param2=value2僅僅是一個例子,它在現實片斷是不同的)

如何使用preg_replace函數使全局替換? 我應該創造這樣的:

$doc[ 'content' ] = $this->preg_replace_all(
     array(
       '/\[~([0-9]+)~\]/', 
       '\[!LatestUpdates(.*)!\]', 
       '\[!ArticleSummary(.*)!\]', 
      ), array(
       '[[~\1]]', 
       '[[!LatestUpdates\1]]', 
       '[[!ArticleSummary\1]]', 
      ), 
      $doc[ 'content' ] 
     ); 

preg_replace_all功能:

private function preg_replace_all($find, $replacement, $s) 
{ 
    while(preg_match($find, $s)) { 
     $s = preg_replace($find, $replacement, $s); 
    } 
    return $s; 
} 

但它不工作。請幫忙解決問題。提前致謝。

+0

默認情況下,preg_replace執行全局替換。你不需要編寫一個新的函數或使用preg_match。 – 2014-11-02 17:45:49

回答

4

preg_replace函數已執行全局替換,並且由於只有匹配的子字符串被替換,所以不需要使用preg_match來測試這些子字符串是否存在。

您可以在三種模式減少到只有一個模式:

$pattern = '/\[(?|(!LatestUpdates|!ArticleSummary)(.*?)!]|(~)([0-9]+)~])/'; 
$replacement = '[[$1$2]]'; 
$doc['content'] = preg_replace($pattern, $replacement, $doc['content']); 

這種模式使用branch reset功能,讓拍攝組在每個方案相同的編號。

如果可能的話(如果它不會改變你希望保留標籤),你可以做同樣的strtr

$doc['content'] = strtr($doc['content'], array('[!'=>'[[!', '[~'=>'[[~', '~]'=>']]', '!]'=>']]')); 

請注意,如果你可以使用它,不猶豫,因爲這種方式要快得多。

+0

我想使用strtr,但我擔心意外的額外更換。但是,感謝3線正則表達式解決方案。我不知道如何在preg_replace中替換捕獲組,但我發現它比我想象的要容易。 – 2014-11-02 18:36:16

+1

@SergiyMatrunchyk:分支重置功能確實是一個非常方便的功能。但是如果你想執行更復雜的替換,請看一下'preg_replace_callback'函數。關於「意外額外替換」,​​請記住,大多數時候,模板系統旨在避免含糊不清。 – 2014-11-02 18:48:47

1

爲什麼使用PHP來做到這一點 - 是否編寫了一個插件,以便在解析頁面時將所有Evolution標籤轉換爲Revolution格式?

如果是這種情況,這樣做效率不高,最好更換數據庫中所有標籤,其中存儲了內容,模板,組塊等。

你可以做到這一點很容易地使用這樣的查詢:

UPDATE modx_site_content SET content = REPLACE(content, '[!', '[[!'); 

你會重複此爲所有其他打開和關閉標籤,並在其他數據庫中的表。

在嘗試此操作前備份您的數據庫...