使用Regex添加空白


Using Regex to add whitespace

我有一个这样的字符串:

text..moretext,moartxt..,asd,,gerr..,gf,erg;ds

基本上就是可变长度的文本,后面跟着可变长度的标点符号,后面跟着更多可变长度的文本,等等。

我怎么能把上面的字符串转换成这个在PHP使用正则表达式?

text. .moretext, moartxt. . ,asd, ,gerr. . ,gf, erg; ds

每个单词的两边只能有一个标点符号

描述

我会分两步完成,首先是每个单词后面的标点符号。然后是单词前的标点符号。

PHP代码示例:
<?php
$sourcestring="text..moretext,moartxt..,asd,,gerr..,gf,erg;ds";
echo preg_replace('/('w[.,;])([^'s])/i',''1 '2',$sourcestring);
?>
$sourcestring after replacement:
text. .moretext, moartxt. .,asd, ,gerr. .,gf, erg; ds

<?php
$sourcestring="text. .moretext, moartxt. .,asd, ,gerr. .,gf, erg; ds";
echo preg_replace('/([^'s])([.,;]'w)/i',''1 '2',$sourcestring);
?>
$sourcestring after replacement:
text. .moretext, moartxt. . ,asd, ,gerr. . ,gf, erg; ds

让我们用preg_replace_callback:

来解决这个问题代码

$string = 'text..moretext,moartxt..,asd,,gerr..,gf,erg;ds';
$chars = ''.,;'; // You need to escape some characters
$new_string = preg_replace_callback('#['.$chars.']+#i', function($m){
    return strlen($m[0]) == 1 ? $m[0].' ':implode(' ', str_split($m[0]));
}, $string); // This requires PHP 5.3+
echo $new_string; // text. .moretext, moartxt. . ,asd, ,gerr. . ,gf, erg; ds

在线演示