0

我有一个这样的字符串:

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

这基本上是可变数量的文本,然后是可变数量的标点符号,然后是更多可变数量的文本等等。

如何使用正则表达式在 PHP 中将上述字符串转换为这个字符串?

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

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

4

2 回答 2

2

描述

我会分两次这样做,首先是每个单词后面的标点符号。然后是单词前的标点符号。

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
于 2013-05-25T19:09:19.803 回答
0

让我们用preg_replace_callback解决这个问题:

Code

$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

Online demo

于 2013-05-25T19:14:19.937 回答