PHP:preg_replace使用反向引用替换缩写

时间:2013-08-04 12:21:26

标签: php regex preg-replace

我想在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);
?>

有没有办法合并两个正则表达式?

当我使用以下表达式时,我无法使用匹配的字符:

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

非常感谢任何帮助。

1 个答案:

答案 0 :(得分: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);

我使用lookbehind (?<=..)而不是对整个匹配进行反向引用。没有捕获任何内容,并且正则表达式引擎处于良好的偏移量以添加\,