【问题标题】:PHP: preg_replace replace abbreviation using backreferencesPHP:preg_replace 使用反向引用替换缩写
【发布时间】:2013-08-04 12:21:25
【问题描述】:

我想在 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

非常感谢任何帮助。

【问题讨论】:

    标签: php regex preg-replace


    【解决方案1】:

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

    你可以使用:

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

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

    第二种解决方案:

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

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

    的良好偏移量

    【讨论】:

    • 非常感谢您的回答。但不幸的是它给了我 m.\,w.H.而不是 m.\,w.\,H.
    • @Mark:我不知道为什么!我已经编辑了一个可行的解决方案。
    • 太棒了!它现在正在工作。只要我有足够的声望点,我就会支持你的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-11
    • 2011-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多