php函数中的错误,用段落标记替换换行符

时间:2012-04-16 13:43:52

标签: php preg-replace str-replace

我有一个php函数,用于将换行符转换为段落,但忽略已经包含在h,ul,ol或li标记中的任何行。这工作正常,除非字符串如下:

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

在结束ul之前放置一个p标签

这是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>"));

?>

任何想法如何防止这个小错误?

1 个答案:

答案 0 :(得分:2)

这应该适用于您发布的代码示例。但是,它匹配所有标签,而不仅仅是您请求的h,ul,ol和li。

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