我想在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
非常感谢任何帮助。
答案 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 (?<=..)
而不是对整个匹配进行反向引用。没有捕获任何内容,并且正则表达式引擎处于良好的偏移量以添加\,