【问题标题】:PHP mysql formatting textPHP mysql 格式化文本
【发布时间】:2012-02-10 15:58:53
【问题描述】:

我有以下代码可以很好地格式化 SQL 表中的文本。不过好像有点啰嗦。

它将从换行符创建段落,但忽略标题和列表标签(不将它们包装在“p”标签中。

谁能看到一个明显的方法来浓缩这个?

<?php

function format_html($content)
 {
  $content = str_replace("<h1>\r\n", "<h1>", $content);
  $content = str_replace("</h1>\r\n", "</h1><p>", $content);
  $content = str_replace("<h2>\r\n", "<h2>", $content);
  $content = str_replace("</h2>\r\n", "</h2><p>", $content);
  $content = str_replace("<h3>\r\n", "<h3>", $content);
  $content = str_replace("</h3>\r\n", "</h3><p>", $content);
  $content = str_replace("<h4>\r\n", "<h4>", $content);
  $content = str_replace("</h4>\r\n", "</h4><p>", $content);
  $content = str_replace("<h5>\r\n", "<h5>", $content);
  $content = str_replace("</h5>\r\n", "</h5><p>", $content);
  $content = str_replace("<h6>\r\n", "<h6>", $content);
  $content = str_replace("</h6>\r\n", "</h6><p>", $content);
  $content = str_replace("<ul>\r\n", "<ul>", $content);
  $content = str_replace("</ul>\r\n", "</ul><p>", $content);
  $content = str_replace("<ol>\r\n", "<ol>", $content);
  $content = str_replace("</ol>\r\n", "</ol><p>", $content);
  $content = str_replace("<li>\r\n", "<li>", $content);
  $content = str_replace("</li>\r\n", "</li>", $content);
  $content = "<p>" . str_replace("\r\n", "</p><p>", $content);
  $content = str_replace("<p><h1>", "<h1>", $content);
  $content = str_replace("<p><h2>", "<h2>", $content);
  $content = str_replace("<p><h3>", "<h3>", $content);
  $content = str_replace("<p><h4>", "<h4>", $content);
  $content = str_replace("<p><h5>", "<h5>", $content);
  $content = str_replace("<p><h6>", "<h6>", $content);
  $content = str_replace("<p><ul>", "<ul>", $content);
  $content = str_replace("<p><ol>", "<ol>", $content);
  return $content;
 }

function format_html_end($content)
 {
  $content = str_replace("</h1></p>", "</h1>", $content);
  $content = str_replace("</h2></p>", "</h2>", $content);
  $content = str_replace("</h3></p>", "</h3>", $content);
  $content = str_replace("</h4></p>", "</h4>", $content);
  $content = str_replace("</h5></p>", "</h5>", $content);
  $content = str_replace("</h6></p>", "</h6>", $content);
  $content = str_replace("</ul></p>", "</ul>", $content);
  $content = str_replace("</ol></p>", "</ol>", $content);
  return $content;
 }

?>

<?php
$con = mysql_connect("localhost","username","password");
if (!$con)
  {
  die('Could not connect: ' . mysql_error());
  }

mysql_select_db("db", $con);

$result = mysql_query("SELECT column FROM table WHERE id = '1'");

while($row = mysql_fetch_array($result))
  {
  $content = $row['column'];
  echo format_html_end(format_html("$content</p>"));
  }

mysql_close($con);
?>

表格中的内容将如下所示...

<h1>Header</h1>
ertertert
ertertertert
rhdfgh
dfghdfghdfgh
ddfgh
<ul>
<li>fdghdfghd</li>
<li>fghjfghj</li>
</ul>

【问题讨论】:

  • 您真正想要完成的是什么?除非有 pre 标记,否则新行仅被视为空白并与 HTML 中的其他空白压缩。
  • 您删除的&lt;p&gt; 比相应的&lt;/p&gt; 多。代码看起来很糟糕。我相信你会遇到标签匹配问题
  • 我对 php 还很陌生,所以不太确定所有可用的 php 函数......我问是否有更好的方法来做到这一点?

标签: php mysql text formatting


【解决方案1】:

应该不是在这里进行代码审查,但是嗯:

str_replace 接受数组,例如:

<?php

function format_html($content)
 {
  $replace = array("<h1>\r\n","</h1>\r\n","<h2>\r\n",...);
  $with = array("<h1>","</h1>","<h2>\r\n",...);

  $content = str_replace($replace, $with, $content);
  return $content;
 }

【讨论】:

    【解决方案2】:

    您几乎可以使用一些正则表达式来处理所有这些问题:

    $content = preg_replace("/<(h[1-6]|ul|ol)>\r\n/", "<$1>", $content);
    $content = preg_replace("/<\/(h[1-6]|ul|ol)>\r\n/", "</$1><p>", $content);
    $content = preg_replace("/<(\/?)li>\r\n/", "<$1li>", $content);
    $content = preg_replace("/<p><(h[1-6]|ul|ol)>/", "<$1>", $content);
    $content = preg_replace("/<\/(h[1-6]|ul|ol)><\/p>/", "</$1>", $content);
    

    这些技巧是您可以在进行替换时使用捕获和反向引用。例如,第一个正则表达式可以匹配h1-h6ulol,并且在替换$1 的过程中,它具有匹配的任何一个的值。

    我将保留以下代码行,因为它与其他正则表达式没有任何共同之处,并且工作正常。

    $content = "<p>" . str_replace("\r\n", "</p><p>", $content);
    

    【讨论】:

    • 这几乎可以正常工作,尽管它在每个列表项的第二个处发生故障。它将 p 标记添加到第二个和后续列表项。
    • 我明白了...列表项的处理略有不同。我会修改我的答案。
    【解决方案3】:

    我不明白您为什么需要所有这些替换,但您可以使用带有 str_replace 的数组

    【讨论】:

      【解决方案4】:

      有很多,你可以这样做:

      $content = str_replace(PHP_EOL, "<p>", $content);
      

      【讨论】:

        【解决方案5】:

        你会想做一个多部分的正则表达式。这是我很快充实的可能有用的东西。通过使用环视表达式匹配,这将大大减少代码量。如果这些是通用标记规则,请将下面的“”替换为“<.>”。

        $patterns = array();
        $patterns[0] = '/(?<=<h[1-6]>)\r\n/'; // removes \r\n after the tag
        $patterns[1] = '/<p>(?=<h[1-6]>)/'; // removes <p> if before the tag
        echo preg_replace($patterns, '', $content);
        

        关于 preg_replace 的帮助:http://www.php.net/manual/en/function.preg-replace.php

        向前看向后看:http://www.regular-expressions.info/refadv.html

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-09-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多