2013-02-07 12 views
6

Chcę konwertować podziały wierszy na akapity.preg_replace: konwertowanie podziałów wierszy na akapity

Na przykład

$string = "1st paragraph 

2nd paragraph 


3rd paragraph 
"; 

chcę uzyskać,

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

i

$string = "1st paragraph 

2nd paragraph 
a line break 

3rd paragraph 
"; 

się,

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

Czy to możliwe z regex i reg_replace? lub coś jeszcze lepszego - xpath?

Próbowałem tego, ale jeszcze nie wynik,

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

Zbyt wiele ograniczników. Podwójne cudzysłowy ograniczają ciąg. Pojedyncze cudzysłowy ograniczają wyrażenie regularne. Po ukośniku nie można śledzić początku łańcucha. –

Odpowiedz

13

Zrób to na odwrót: najpierw wymienić kilka linebreaks w punktach, a następnie zastąpić pojedyncze linebreaks przez <br> elementów.

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

też należy znormalizować zakończeń linii pierwszej (okna styl do stylu 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

dzięki za odpowiedź. ale mam to w rezultacie chociaż '

1-ty ust

akapit 2

ust 3-ty

' – laukok

+1

@lauthiamkok może chcesz traktować wiersze zawierające spacje tylko jako pusta? '/ \ n (\ s * \ n) + /' –

+0

dzięki Jan - '/ \ n (\ s * \ n) + /' daje pożądany rezultat. Dziękuję Ci! – laukok

3

Jeszcze inne rozwiązanie:

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

Dziękuję Omar. – laukok

Powiązane problemy