2013-05-25 41 views
0

我有一個這樣的字符串:使用正則表達式來添加空格

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

這基本上是可變數量的文本,其次是可變數量的標點,然後是文本的進一步可變數量等等。

如何使用正則表達式在PHP中將上述字符串轉換爲此值?

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

每個字可僅具有在其任一側的標點符號1個字符。

+0

當您在連續標點符號的最後一個字符和下一個字母之間放置空格時,是否有規則?在你的例子中,有時你會放置一個空格(例如'moretext,moartxt'),有時你不會(例如'。,asd,')。如果你是一致的,或者沒有關係,那麼答案很簡單。 – lurker

+0

優先考慮最早的單詞,但如果該單詞已在該單詞的末尾有一個字母,則將其指定給下一個單詞。我希望這很清楚,但不應該太重要。 – CHRIS

+0

這是哪種語言/編輯/環境? – FrankieTheKneeMan

回答

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 
+0

非常感謝!工作正常。 – CHRIS

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