4

我想preg_replace在 PHP 中对以下字符串执行字符替换:

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

任何帮助是极大的赞赏。

4

1 回答 1

4

这个想法是找到所有单个字母+点\b[a-z]\.,然后是另一个单个字母+点。

您可以使用:

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

where(?=..)是只执行检查的前瞻(后跟

第二种解决方案:

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

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

于 2013-08-04T12:27:00.753 回答