2012-04-16 56 views
0

我有一個PHP函數用於將換行符轉換爲段落,但忽略已包含在h,ul,ol或li標記中的任何行。這工作正常,除非這個字符串如下:在php函數中用段落標記替換換行符的錯誤

<h1>lkjhlkjkl</h1> 
hgjk 
<ul> 
<li>hjgkghjk</li></ul> 
ghjkghj 

呈現如下:

<h1>lkjhlkjkl</h1><p>hgjk</p><ul><li>hjgkghjk</li></ul><p>ghjkghj</p>

但如果收盤UL標籤是在單獨一行它呈現了以下結果:

<h1>lkjhlkjkl</h1><p>hgjk</p><ul><li>hjgkghjk</li><p></ul><p>ghjkghj</p>

在關閉前放置ap標籤ul

這裏的PHP:

<?php 
function format_html($content) 
{ 
    $content = preg_replace("/<(h[1-6]|ul|ol|li)>\n/", "<$1>", $content); 
    $content = preg_replace("/<\/(h[1-6]|ul|ol|li)>\n/", "</$1><p>", $content); 
    $content = "<p>" . str_replace("\n", "</p><p>", $content); 
    $content = preg_replace("/<p><(h[1-6]|ul|ol|li)>/", "<$1>", $content); 
    return $content; 
} 

function format_html_end($content) 
{ 
    $content = preg_replace("/<\/(h[1-6]|ul|ol|li)><\/p>/", "</$1>", $content); 
    return $content; 
} 

echo format_html_end(format_html("$content</p>")); 

?> 

任何想法如何防止這種小蟲子?

回答

2

這應該適用於您發佈的代碼示例。但是,它匹配所有標籤,而不僅僅是您要求的h,ul,ol和li。

$content = preg_replace("/\n([^<>]+)/", "<p>$1</p>", $content); 
$content = str_replace("\n", "", $str); 
echo $content; 
+0

如果該行以一個強標記開始會怎樣?這就是爲什麼我指定要應用它的標籤。 – Tom 2012-04-16 15:29:55