2012-04-16 14 views
0

改行を段落に変換するがh、ul、ol、またはliタグですでにラップされている行は無視するphp関数があります。これは、次のように文字列がある場合を除いて正常に動作します:改行を段落タグで置き換える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>

閉じる前にpタグを配置する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

関連する問題