【问题标题】:Only allow the first 50-60 characters of a text field to be shown once posted [duplicate]仅允许在发布后显示文本字段的前 50-60 个字符[重复]
【发布时间】:2015-11-17 09:36:57
【问题描述】:

我只想在我的页面上显示已上传到数据库的 '$output' 的前 50 个字符,最简单的方法是什么?如果 $output 包含超过 50 个字符,我希望文本以它可以不超过 50 个字符的最后一个单词结尾,然后放一个“...”之类的东西,就像“阅读更多”部分一样。

PHP:

    <?php 
        require_once("nbbc/nbbc.php");

        $bbcode = new BBCode;

        $sql = "SELECT * FROM posts ORDER BY id DESC";

        $res = mysqli_query($dbCon, $sql) or die(mysqli_error($dbCon));

        $posts = "";

        if(mysqli_num_rows($res) > 0) {
            while($row = mysqli_fetch_assoc($res)) {
                $id = $row['id'];
                $title = $row['title'];
                $subtitle = $row['subtitle'];
                $content = $row['content'];
                $date = $row['date'];

                $output = $bbcode->Parse($content);

                $posts .= "<div id='post'><h2><a href='view_post.php?pid=$id' target='_blank'>$title</a></h2><h3 id='subtitle'>$subtitle</h3><h3 id='datethingy'><span style='color: #457F2C;'>Last updated:</span> $date</h3><p>$output</p></div>";

            }
            echo $posts;
        }else {
            echo "There are no posts to be displayed.";
        }
    ?>

【问题讨论】:

  • 你想要子字符串前 50 还是从 50 到 60 的子字符串或其他?
  • $content = $row['content'] 的输出是什么?问题可能出现在 BBCode 而不是数据库上。

标签: php mysql substring


【解决方案1】:

你可以这样做:

$str50 = substr($mystring, 0, 50);

【讨论】:

    【解决方案2】:

    如果不想删词,最好的办法是使用wordwrap函数,像这样:

    function tokenTruncate($string, $your_desired_width) {
      $parts = preg_split('/([\s\n\r]+)/', $string, null, PREG_SPLIT_DELIM_CAPTURE);
      $parts_count = count($parts);
    
      $length = 0;
      $last_part = 0;
      for (; $last_part < $parts_count; ++$last_part) {
        $length += strlen($parts[$last_part]);
        if ($length > $your_desired_width) { break; }
      }
    
      return implode(array_slice($parts, 0, $last_part));
    }
    

    这会将文本分成每行不超过 60 个字符的行,然后选择第一行。诸如文本短于 60 个字符或在该限制之前有换行符的情况也会被处理。

    【讨论】:

      【解决方案3】:

      最简单的

      您可以只使用 substr 获取前 50 个字符。

      $output = substr($output, 0, 50);
      

      最高效的

      如果您只打算显示前 50 个字符,则只在数据库中查询前 50 个字符。这效率更高,因为您从数据库中传输的数据更少。

      // This is your SQL statement
      SELECT LEFT(field, 50) AS excerpt FROM `table` WHERE ...
      

      有关仅从数据库中检索前 X 个字符的更多信息,请参阅 this answer

      【讨论】:

        【解决方案4】:

        如果您的“$ouput”​​会像您说的那样显示在文本字段中,最简单的方法是:

        <input type="text" maxlength="50">
        

        【讨论】:

        • 这是迄今为止最好的解决方案,把它扼杀在萌芽状态:)
        • 对不起,我在原始帖子中不够清楚,这很好,但我已经更新了我的帖子,以更详细地详细说明我想要的内容。
        【解决方案5】:

        使用以下之一,

        $trimmedOutput = substr($output, 0, 50);
        

        第一个参数是您想要子字符串的字符串。第二个参数是您希望子字符串在原始字符串中的位置,最后一个参数是它想要停止的位置。

        如果您想要 60 个字符,请将 50 更改为 60。

        【讨论】:

          【解决方案6】:

          这是最简单的方法,在剪切后带有漂亮的点:

          echo (strlen($var) > $length ? substr($var, 0, $length).'...' : $var);
          

          【讨论】:

          • 如何在我的代码中实现它?抱歉,我是新手。
          • ".(strlen($output) > $length ? substr($output, 0, $length)."..." : $var)."

            但是你必须确定 $length = 50;首先
          猜你喜欢
          • 1970-01-01
          • 2010-10-17
          • 2014-06-19
          • 2015-05-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-09-03
          • 1970-01-01
          相关资源
          最近更新 更多