2013-08-04 15 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