我有一个这样的字符串:
text..moretext,moartxt..,asd,,gerr..,gf,erg;ds
基本上,可变数量的文本,后跟可变数量的标点符号,然后是更多可变数量的文本等等。
如何使用Regex将上述字符串转换为PHP?
text. .moretext, moartxt. . ,asd, ,gerr. . ,gf, erg; ds
每个单词在其两侧只能有1个字符的标点符号。
答案 0 :(得分:2)
我会在两遍中做到这一点,首先是每个单词后面的标点符号。然后在单词之前传递标点符号。
<?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
答案 1 :(得分:0)
让我们用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
的 Online demo 强>