2013-02-07 171 views
6

我想將換行符轉換爲段落。preg_replace:將換行符轉換爲段落

例如

$string = "1st paragraph 

2nd paragraph 


3rd paragraph 
"; 

我想,

<p>1st paragraph</p> 
<p>2nd paragraph</p> 
<p>3rd paragraph</p> 

,並

$string = "1st paragraph 

2nd paragraph 
a line break 

3rd paragraph 
"; 

成,

<p>1st paragraph</p> 
<p>2nd paragraph<br/>a line break</p> 
<p>3rd paragraph</p> 

regexreg_replace可能嗎?或其他更好的東西 - xpath

我已經試過這一點,但沒有結果呢,

echo preg_replace("'/^(.*?)(<br\s*\/?>\s*)+/'", "<p>$1</p>", nl2br($string)); 
+0

太多的分隔符。雙引號分隔字符串。單引號分隔正則表達式。正斜槓不能跟在字符串的開頭。 –

回答

13

做它的其他方式輪:一是通過段落取代多個換行符,然後通過<br>元素取代單換行符。

$str = preg_replace('/\n(\s*\n)+/', '</p><p>', $str); 
$str = preg_replace('/\n/', '<br>', $str); 
$str = '<p>'.$str.'</p>'; 

你也應該首先規格化行尾(windows風格到UNIX風格):

function normalize($str) { 
    // Normalize line endings 
    // Convert all line-endings to UNIX format 
    $s = str_replace("\r\n", "\n", $s); 
    $s = str_replace("\r", "\n", $s); 
    // Don't allow out-of-control blank lines 
    $s = preg_replace("/\n{2,}/", "\n\n", $s); 
    return $s; 
} 
+0

感謝您的答案。但我得到這個結果雖然'

1段

第二段

第三段

' – laukok

+1

@lauthiamkok也許你要正確對待只包含空白的空行? '/ \ n(\ s * \ n)+ /' –

+0

謝謝Jan - '/ \ n(\ s * \ n)+ /'給出我想要的結果。謝謝! – laukok

3

又一解決方案:

$string = preg_replace('/\n{2,}/', "</p><p>", trim($string)); 
$string = preg_replace('/\n/', '<br>',$string); 
$string = "<p>{$string}</p>"; 
+0

謝謝奧馬爾。 – laukok