【问题标题】:Remove new lines after echoing HTML from PHP从 PHP 回显 HTML 后删除新行
【发布时间】:2015-02-11 20:40:54
【问题描述】:

我有一个 Wordpress 功能,可以检查用户是否填写了他或她个人资料中的某些字段。如果填写,则回显其内容,如果没有:不要。这是乐趣的精简版

<ul>
    <?php if (get_the_author_meta('url',$theID)) : ?>
        <li class="url">
            <a href="<?php the_author_meta('url',$theID); ?>" title="">Website</a>
        </li>
    <?php endif; // End check for url ?>
    <?php if ( get_the_author_meta('twitter',$theID)) : ?>
        <li class="twitter">
            <a href="http://twitter.com/<?php the_author_meta('twitter',$theID); ?>" title="">Twitter</a>
        </li>
    <?php endif; // End check for twitter ?>
    <?php if ( get_the_author_meta('instagram',$theID)) : ?>
        <li class="instagram">
            <a href="http://instagram.com/<?php the_author_meta('instagram',$theID); ?>" title="">Instagram</a>
        </li>
    <?php endif; // End check for instagram ?>
    <?php if ( get_the_author_meta('linkedin',$theID)) : ?>
        <li class="linkedin">
            <a href="http://www.linkedin.com/<?php the_author_meta('linkedin',$theID); ?>" title="">LinkedIn</a>
        </li>
    <?php endif; // End check for linkedin ?>
</ul>

这很好用。但是,出于布局目的,我在这些元素上使用inline,我不能使用浮点数。您可能知道,这会导致元素之间出现“间隙”,因为它们都在新行上回显。

我不想要这些差距。我知道我可以通过任意负边距来解决它,但我不想使用它,因为我使用的是响应式、基于百分比的布局。解决方案是通过将所有 HTML 粘合在一起而无需换行来“填补 HTML 中的空白”。举个例子:

内联显示时会产生间隙:

<ul>
  <li>Twitter</li>
  <li>Instagram</li>
  <li>LinkedIn</li>
</ul>

不会有间隙:

<ul>
  <li>Twitter</li><li>Instagram</li><li>LinkedIn</li>
</ul>

我正在寻找一个 PHP 解决方案(无 CSS),它可以摆脱 ul 中的所有新行,但我不知道从哪里开始。或者,更准确地说,我不知道将删除新行的函数放在哪里。如何包装所有 HTML,然后用 ... nothing 替换新行?

【问题讨论】:

  • 您是否尝试过删除源代码中 HTML 和 PHP 之间的空格?
  • 好吧,与其将 HTML 和 PHP 部分混合在一起,不如将 HTML 代码收集到一个字符串中输出——这样一开始就不会出现空格;但这宁愿使模板变得混乱。第二种选择是使用输出缓冲区,然后在输出缓冲区内容之前替换其中的空格。
  • 在这种情况下,我个人更喜欢 APAD1 已经发布的链接中提到的评论方法——它保留了使用 PHP 作为模板语言的优势,消除了不需要的效果,并且可能修改此模板时,您也不会忘记上面的附加 PHP 注释。
  • @CBroe 查看我自己的答案。谢谢。谢谢 APAD1 我只知道负边距黑客,而不是评论黑客!

标签: php wordpress replace newline


【解决方案1】:

您是否尝试过类似的方法:

$string = str_replace("\n", "", $string);

或:

$string = str_replace("\n\r", "", $string);

(其中 $string 是您要在一行中获取的 html)

【讨论】:

  • 这是我的问题,不是所有的 HTML 总是输出,所以我不知道如何获取字符串。
  • 在这种情况下:你不能从一个空变量开始 - 比如$output=''。然后在所有条件语句中只做(例如)$output .= '&lt;li class="url"&gt;&lt;a href="' . the_author_meta('url',$theID) . '" title=""&gt;Website&lt;/a&gt;&lt;/li&gt;'(没有任何换行符),最后是echo $output;
  • 这确实是另一种选择。
  • 这将是使用最少资源的选项..如果你可以避免 preg_replace() 你应该..
【解决方案2】:
<ul class="author-meta">
    <?php
        if (get_the_author_meta('url', $theID)) {
            $output = '<li class="url"><a href="' . get_the_author_meta('url', $theID) . '" title="">Website</a></li>';
        }
        if ( get_the_author_meta('twitter', $theID)) {
            $output .= '<li class="twitter"><a href="http://twitter.com/' . get_the_author_meta('twitter', $theID) . '" title="">Twitter</a></li>';
        }
        if ( get_the_author_meta('instagram', $theID)) {
            $output .= '<li class="instagram"><a href="http://instagram.com/' . get_the_author_meta('instagram', $theID) . '" title="">Instagram</a></li>';
        }
        if ( get_the_author_meta('linkedin', $theID)) {
            $output .= '<li class="linkedin"><a href="http://www.linkedin.com/' . get_the_author_meta('linkedin', $theID) . '" title="">LinkedIn</a></li>';
        }
        echo $output;
    ?>
</ul>

由 Bram Vanroy 编辑:确保在 PHP 中使用该函数时使用 get_the_author_meta 而不是 the_author_meta

【讨论】:

  • 你为什么不直接edit你的帖子?
  • 我讨厌不符合 PSR-2.. 每个逗号后面都需要 1 个空格 :-) 请参阅 php-fig.org/psr/psr-2 它真的有助于遵循这种编码风格..
  • 不,我的意思是:你为什么要做出一个新的答案而不是编辑以前的答案?
  • 啊..因为登录用户在这里我有点新。多年来我一直在使用 Stackoverflow 寻找答案,直到最近才觉得有必要做点什么来帮助他人。只是想为未来有同样问题的用户提供一个复制/粘贴答案 - 没想到编辑另一个。好建议,下次我会这样做:-)
  • 很高兴能帮上忙,伙计!祝你的项目好运。
【解决方案3】:

你可以这样做:

ob_start();
//echo whatever stuff you need
echo str_replace(PHP_EOL, NULL, ob_get_clean());

使用PHP_EOL 而不是\n\r\n 将捕获换行符,无论平台如何。

【讨论】:

    【解决方案4】:

    您可以为此使用缓冲区:

    <?php 
    function remove_white_spaces($buffer){
        return trim(preg_replace('/\s\s+/', ' ', $buffer));
    }
    ob_start('remove_white_spaces'); 
    ?>
    <ul>
        <?php if (get_the_author_meta('url',$theID)) : ?>
            <li class="url">
                <a href="<?php the_author_meta('url',$theID); ?>" title="">Website</a>
            </li>
        <?php endif; // End check for url ?>
        <?php if ( get_the_author_meta('twitter',$theID)) : ?>
            <li class="twitter">
                <a href="http://twitter.com/<?php the_author_meta('twitter',$theID); ?>" title="">Twitter</a>
            </li>
        <?php endif; // End check for twitter ?>
        <?php if ( get_the_author_meta('instagram',$theID)) : ?>
            <li class="instagram">
                <a href="http://instagram.com/<?php the_author_meta('instagram',$theID); ?>" title="">Instagram</a>
            </li>
        <?php endif; // End check for instagram ?>
        <?php if ( get_the_author_meta('linkedin',$theID)) : ?>
            <li class="linkedin">
                <a href="http://www.linkedin.com/<?php the_author_meta('linkedin',$theID); ?>" title="">LinkedIn</a>
            </li>
        <?php endif; // End check for linkedin ?>
    </ul>
    <?php ob_end_flush(); ?>
    

    捕获缓冲区上的所有输出,运行一个函数以用空白替换新行,然后释放缓冲区。

    【讨论】:

    • “运行一个函数用空格替换新行”——元素标签之间的单个空格仍然会导致效果;必须删除它们之间的所有空格。然而,这会产生问题,因为您无法删除标签本身(liclassahreftitle 之间)或链接文本中的空格。所以你必须在这里使用一个相当丑陋的正则表达式来修改 HTML 解决方案......这就是为什么我真的更喜欢 cmets 方法,如 cmets 中所说。
    【解决方案5】:

    只需将您的 ul 字体大小设置为 0 并将大小应用于您的 li

    font-size: 15px; display: inline-block;
    

    【讨论】:

    • 我特别要求的是 PHP 解决方案,而不是 CSS 解决方案。
    • 这不是解决方案。这是问题。
    • 这是什么回复。如果你能从根本上解决问题,即在输出酒店之前,那比任何案例解决方案都要好。
    • 是的。问题不在于 PHP。问题与 HTML/CSS 相关。您想要的是 li 之间的空格不应被视为空格。有很多要阅读的内容,PHP css-tricks.com/fighting-the-space-between-inline-block-elements 没有解决方案
    • 这正是重点。使用 PHP 解决方案,您可以更改输出 HTML 以解决问题。如果没有 CSS,这完全有可能。
    【解决方案6】:

    根据@APAD1 的评论和@CBroe 的反馈,我决定采用评论方法。尽管 HTML 输出不是很漂亮(空 cmets,byebye 语义),但它可以完美运行。

    <ul class="author-meta">
        <?php if (get_the_author_meta('url',$theID)) : ?><li class="url">
                <a href="<?php the_author_meta('url',$theID); ?>" title="">Website</a>
            </li><?php endif; // End check for url ?><!--
        --><?php if ( get_the_author_meta('twitter',$theID)) : ?><li class="twitter">
                <a href="http://twitter.com/<?php the_author_meta('twitter',$theID); ?>" title="">Twitter</a>
            </li><?php endif; // End check for twitter ?><!--
        --><?php if ( get_the_author_meta('instagram',$theID)) : ?><li class="instagram">
                <a href="http://instagram.com/<?php the_author_meta('instagram',$theID); ?>" title="">Instagram</a>
            </li><?php endif; // End check for instagram ?><!--
        --><?php if ( get_the_author_meta('linkedin',$theID)) : ?><li class="linkedin">
                <a href="http://www.linkedin.com/<?php the_author_meta('linkedin',$theID); ?>" title="">LinkedIn</a>
            </li><?php endif; // End check for linkedin ?>
    </ul>
    

    请注意,cmets 应该在if 子句之外,因为如果它们在里面,它们可能不会被正确地回显,例如缺少开始或结束标记。

    【讨论】:

      【解决方案7】:

      给你:

      <ul><?php 
      $output = '';
      if (get_the_author_meta('url', $theID)) {
          $output .= '<li class="url"><a href="' . the_author_meta('url',$theID) . '" title="">Website</a></li>';
      } elseif (get_the_author_meta('twitter', $theID)) {
          $output .= '<li class="twitter"><a href="http://twitter.com/' . the_author_meta('twitter', $theID) . '" title="">Twitter</a></li>';
      } elseif (get_the_author_meta('instagram', $theID)) {
          $output .= '<li class="instagram"><a href="http://instagram.com/' .  the_author_meta('instagram', $theID) . '" title="">Instagram</a></li>';
      } elseif (get_the_author_meta('linkedin',$theID)) {
          $output .= '<li class="linkedin"><a href="http://www.linkedin.com/' . the_author_meta('linkedin', $theID) . '" title="">LinkedIn</a></li>';
      }
      echo $output;
      ?></ul>
      

      【讨论】:

      • elseifs 应该都是单独的 if 的。但其余的看起来不错!
      • 好吧,那么你可以让我开心并接受我的回答:-)
      • 请先将elseifs改为ifs。
      【解决方案8】:

      为了制作一个易于使用的版本,您可以将所有网站数据存储在一个数组中:

      $site=Array(
         "url"=>"Website",
         "twitter"=> "Twitter",
         "instagram"=> "Instagram",
         "linkedin"=>"LinkedIn"
      );
      

      然后生成整个列表。我使用了一个简单的示例案例,其中所有域都是 .com。如果您想存储更多信息,则必须改进数组格式。

      <ul><?php
      foreach($site as $k=>$v)
      if (get_the_author_meta($k,$theID))
         echo '<li class="'.$k.'"><a href="'
            .(($k=="url")?"":"http://$k.com/")
            .the_author_meta($k,$theID).'">'.$v.'</a></li>';
      ?></ul>
      

      不要忘记删除 a 标签中的空标题属性。

      请注意,还有其他 CSS 替代方案:在 ul 上使用 display:table,在 li 上使用 display:table-cell,或者使用 display: flex 等等。

      【讨论】:

        猜你喜欢
        • 2013-12-01
        • 1970-01-01
        • 2015-02-08
        • 2011-04-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-01-15
        • 2021-09-21
        相关资源
        最近更新 更多