2013-08-04 51 views
4

我想用preg_replace在PHP在下面的字符串來執行字符替換:PHP:更換了preg_replace使用縮寫反向引用

Dieser Text enthält diverse Akürzungen wie z.B., d.h., u.a. oder m.w.H. 

輸出應該是這樣的:

Dieser Text enthält diverse Abkürzungen wie z.\,B., d.\,h., u.\,a. oder m.\,w.\,H. 

目前我使用此代碼:

<?php 
$text = 'Dieser Text enthält diverse Akürzungen wie z.B., d.h., u.a. oder m.w.H.'; 

$searchFor = array(
    '/([a-z]\.)([a-z]\.)([a-z]\.)/i', // m.w.H. 
    '/([a-z]\.)([a-z]\.)/i', // z.B. 
); 

$replaceWith = array(
    '\1\\,\2\\,\3', 
    '\1\\,\2', 
); 

$replaced = preg_replace($searchFor, $replaceWith, $text); 
?> 

有沒有辦法將兩個reg ular表達式?

當我使用下面的表達式,我不能夠使用匹配的字符:

/([a-z]\.){2,}/i 

任何幫助是極大的讚賞。

回答

4

這個想法是找到所有單個字母+點\b[a-z]\.後跟另一個單個字母+點。

你可以使用:

$txt = preg_replace('~\b[a-z]\.(?=[a-z]\.)~i', '$0\,', $txt); 

其中(?=..)是僅進行檢查(其次

解決方法二在先行:

$txt = preg_replace('~(?<=\b[a-z]\.)(?=[a-z]\.)~i', '\,', $txt); 

相反反向引用來整場比賽,我使用了一個倒影(?<=..)。沒有捕獲任何東西,並且正則表達式引擎處於良好的補償位置\,

+0

非常感謝您的回答。但不幸的是,它給了我m \ w.H。而不是m。\,w。\,H。 – Mark

+0

@Mark:我不知道爲什麼!我編輯了一個工作解決方案。 –

+0

太棒了!現在正在工作。只要我有足夠的聲譽點,我就會讚揚你的答案。 – Mark