由PHP

2012-08-09 54 views
0

替換HTML頁面的特殊字符串我正在尋找一種方式與他們定義的值來替換所有的字符串在整個頁面看起來都差不多由PHP

請不要給我推薦包括語言常量的其他方法。

字符串是這樣的:

[_HOME]

[_新聞]

所有的人都在尋找相同的[_ *]部分

現在最大的問題是如何掃描HTML頁面並替換定義的值。

一種方式來解析HTML頁面是使用DOM文檔,然後pre_replace()它

但我的主要問題是用於替換

$pattern = "/[_i]/"; 
$replacement= custom_lang("/i/"); 
$doc = new DOMDocument(); 
$htmlPage = $doc->loadHTML($html); 

preg_replace($pattern, $replacement, $htmlPage); 
+0

在這種情況下,你不需要DOMDocument - 只需要一個'str_replace()',如果你知道你在找什麼。 – Matt 2012-08-09 12:35:30

+0

這並不容易,請檢查我的問題的替換部分。我應該檢查語言文件中每個字符串的定義值 – 2012-08-09 12:44:07

+1

你怎麼可能知道用什麼來替換未知密鑰? – Matt 2012-08-09 12:44:42

回答

2

在RegEx中,[]是運營商,所以如果您使用它們,您需要轉義它們。

與您的表達式的其他問題是_*它將匹配零或更多_。您需要用一些有意義的匹配來替換它,比如_.*,它將匹配_和其後的任何其他字符。所以,你的充分表達而成,

/\[_.*?\]/

嘿,爲什麼一個?,你可能會問:原因是,它執行非貪婪匹配。像,

[_foo] [_bar]是查詢字符串,然後貪婪的匹配應返回一個匹配,並給你它的整體,因爲你的表達式是完全有效的字符串,但非貪婪的匹配會讓你兩個單獨的匹配。 (More information

你可能會更有保障,通過有一個_後跟大寫字母。像,

/\[_[A-Z]+\]/

更新:使用匹配的字符串和替換它們。爲此,我們使用稱爲back-refrencing的概念。

考慮修改上面的表達式,括號,如封閉的字符串,/\[_([A-Z]+)\]/

現在preg-replace參數,我們可以通過反向引用與$1他們使用括號中的表達。所以你可以使用的,

preg_replce("/\[_([A-Z]+)\]/e", "my_wonderful_replacer('$1')", $html); 

注意:我們需要e modifier治療的第二個參數作爲PHP代碼。 (More information

+0

好的模式,並且可能我問,如何preg_replace這些字符串在我的輸出頁面,並檢查我的問題$ replacement = custom_lang(「/ i /」); ,我是指需要更換的物品。 – 2012-08-09 13:11:22

+0

@MacTaylor:查看更新的答案.. – Shubham 2012-08-09 13:20:24

+0

真棒更新,ty – 2012-08-09 14:03:39

-1

寫模式如果您知道完整(例如[_HOME]),則可以使用str_replace()替換所有實例。

不需要通過引入正則表達式來使這樣的事情變得更加複雜。

+0

它不僅是[_HOME],如果我的客戶端使用[_SOMETHING_I_DONT_KNOW],它的複雜本身,這就是爲什麼我有這個問題,我需要找到模式,並reg_replace像這樣的所有字符串 – 2012-08-09 12:43:19