2011-12-29 27 views
0

我有膠乳+以下形式的HTML代碼某處:使用preg_replace_callback識別和操縱膠乳代碼

...some text1.... \[latex-code1\]....some text2....\[latex-code2\]....etc 

首先我想獲得的數組碼[]膠乳碼,以便能夠發送它們爲渲染服務器,使

code[0]=latex-code1, code[1]=latex-code2, etc 

其次,我想,這樣它看起來像修改這樣的文字:

...some text1.... <img src="root/1.png">....some text2....<img src="root/2.png">....etc 

即,第i個乳膠代碼片段被鏈接到第i個渲染圖像所取代。

我一直在嘗試使用preg_replace_callback和preg_match_all來做到這一點,但是對於PHP來說新手並沒有能夠使其工作。請指教。

+0

請顯示你到目前爲止嘗試過的代碼。到目前爲止最成功的一點是什麼?如果太複雜,首先從匹配開始。 – hakre 2011-12-29 04:33:02

+0

要使用preg_match_all得到乳膠代碼,我做了: $ pattern ='/(\ [)(。*)(\])/'; preg_match_all($ pattern,$ content,$ latex_codes,PREG_PATTERN_ORDER); 即使這不是現在的工作。我應該可以在$ latex_codes [1] – user1120407 2011-12-29 04:51:24

回答

1

如果您正在尋找codez:

$html = '...some text1.... \[latex-code1\]....some text2....\[latex-code2\]....etc'; 

$codes = array(); 
$count = 0; 
$replace = function($matches) use (&$codes, &$count) { 
    list(, $codes[]) = $matches; 
    return sprintf('<img src="root/%d.png">', ++$count); 
}; 
$changed = preg_replace_callback('~\\\\\\[(.+?)\\\\\\]~', $replace, $html); 

echo "Original: $html\n"; 
echo "Changed : $changed\n\nLatex Codes: ", print_r($codes, 1), "Count: ", $count; 

我不知道在哪一部分你有問題,如果它的正則表達式,你用你的標誌中的字符,需要重逃逸:對於PHP和PCRE,這就是爲什麼有這麼多斜槓。

另一個棘手的部分是回調函數,因爲它需要收集代碼以及有一個計數器。這是在一個匿名函數的示例中完成的,該函數在use子句中具有可變的別名/引用。這使回調中可用變量$codes$count

+0

中獲得所有乳膠代碼我認爲我遇到了正則表達式模式的問題。這真的有幫助。謝謝! – user1120407 2011-12-29 05:42:31

+0

嗨hakre,你可以寄給我一個低版本的PHP上述代碼的等效版本。我認爲你在$ replace中使用匿名函數,而不是由我的服務器上的php編譯器編譯(bravehost)? – user1120407 2011-12-31 06:21:59

+0

它需要PHP 5.3,沒錯。要在PHP 5.2中執行此操作,需要將回調封裝到一個類函數中,以便可以使'$ codes'和'$ count'變量可用。 – hakre 2011-12-31 11:10:09