【问题标题】:str_ireplace or preg_replace replaced break tag into \r\nstr_ireplace 或 preg_replace 将中断标记替换为 \r\n
【发布时间】:2016-09-15 15:16:18
【问题描述】:

我已阅读this post,其中讨论了将 html 中断标记转换为 php 中的新行。其他人说这对他们有用,但奇怪的事情发生在我身上。

这是我使用的代码:

$breaks = array("<br />", "<br>", "<br/>");  
$jawaban = str_ireplace($breaks, "&#13;&#10;", $jawaban1);`     

这是他们使用的代码:

$breaks = array("<br />", "<br>", "<br/>");
$text = str_ireplace($breaks, "\r\n", $text);

都在文本中插入“\r\n”,为什么会这样?
截屏:

如果有任何以前的帖子/PHP方法,请告诉我

编辑:添加我的代码来回显文本框

<-- THIS WONT WORK -->
$username = $_SESSION['username'];
$unsafenomorsoal = $_POST['nomorsoal'];
$unsafejawaban = $_POST['jawaban'];
$nomorsoal = mysqli_real_escape_string($konek,$unsafenomorsoal);
$jawabannotcut = substr($unsafejawaban,0,50000);
$unsafejawabanfirst = nl2br($jawabannotcut);
$jawaban1 = mysqli_real_escape_string($konek,$unsafejawabanfirst);
$breaks = array("<br />","<br>","<br/>");
$jawaban = str_ireplace($breaks, PHP_EOL, $jawaban1);
$_SESSION['textvaluejawaban'] = $jawaban;

这就是回声:

        echo "<div class=\"head-main-recent-background\"       style=\"background:white;width:99%;color:black;text-align:left;height:1000px;position:relative;top:130px;margin-top:10px;\">- Jawab   Soal -<br/>".$jawabanerror."<br/>Nama : ".$_SESSION['username']."<br/>
      <form method=\"post\" action=\"prosesjawabsoal.php\">
     <input type=\"hidden\" name=\"nomorsoal\"   value=\"".$_SESSION['nomorsoal']."\"/>
      Jawaban : <br/>
      <textarea placeholder=\"Max 40.000 Huruf\" style=\"overflow-  x:none;width:99%;height:300px;\" type=\"text\" name=\"jawaban\" maxlength=\"40000\" >".$_SESSION['textvaluejawaban']."</textarea>
       <br/>Captcha <br/>
            <div style=\"overflow:hidden;\" class=\"g-recaptcha\" data-   sitekey=\"6LfYQicTAAAAAFstkQsUDVgQ60x_93obnKAMKIM9\"></div><br/>
            <button type=\"submit\" name=\"submit\" style=\"margin-top:10px;height:auto;width:auto;\">Kirim Jawaban</button>
           </form>
            </div>";

注意:sn-p 不起作用,因为它是 php
抱歉,由于发布代码时出错,我使用了 sn-p!

编辑:
尝试了 preg_replace() 方法,但结果仍然相同

编辑:
更改标题以告知 preg_replace 不起作用

【问题讨论】:

  • 你试过 PHP_EOL 吗?
  • 还是一样的结果,\r\n 仍然包括
  • &amp;#13;&amp;#10; is\r\n 基本相同——它们都表示相同的字节值,只是在不同的上下文中。但是上面显示的两个代码 sn-ps 不可能产生相同的输出。很可能您只是解释结果错误。 (它在屏幕截图中的 textarea 中显示的内容不能是 original 数据,因为这样 \r\n 不会显示为那些 characters。)
  • 编辑:添加我的代码来回显结果

标签: php html


【解决方案1】:

您的问题是 mysqli_real_escape_string()。将 "\r\n" 转换为字符串,以便安全地输入数据库。将其完全删除。而是在输出到屏幕时使用htmlspecialchars

echo htmlspecialchars($myUnsafeVar);

应用这些规则(作为起点,总会有例外,但在极少数情况下):

  • 在将字符串输入数据库时​​使用mysqli_real_escape_string。输出到屏幕时,它不会像您期望的那样 - 所以任何已经被 mysql escaped() 的东西都不应该出现在屏幕上。
  • 输出到屏幕时使用htmlspecialchars(你没有!)。
  • 使用 url_encode 将内容添加到 URL 中
  • 还有许多不同的“转义”功能(例如插入 JSON、插入 mysql、插入其他数据库)。将正确的用于您需要的 - 不要将其用于其他目的。

查看功能了解更多详情。

就目前而言,即使付出了所有这些努力,您的代码也不安全 - 但修复起来真的很简单!

【讨论】:

  • 这与 Haresh Vidja 的回答相结合是完整的解决方案。
【解决方案2】:

尝试使用preg_replace() 函数,不需要\n\r,你可以只使用\nPHP_EOL

$jawaban = preg_replace('#<br\s*?/?>#i', "\n", $jawaban1);

$jawaban = preg_replace('#<br\s*?/?>#i', PHP_EOL, $jawaban1);

【讨论】:

  • 不,这是一个绝对正确的答案。你做错了什么。请参阅3v4l.org/snq0P ...请提供您用于生成示例的代码。
【解决方案3】:

在使用字符串之前您必须了解这些:

  1. “\n\r”表示换行。
  2. '\n\r' 表示换行。
  3. &amp;#13;&amp;#10; 表示换行。它只是 HTML 符号的 HTML 编号。当您使用它时,您的意思是只是在您的浏览器中显示\n\r。这是对您问题的回答:

都在文本中插入“\r\n”,为什么会这样?

所以,知道了之后,你就明白了:

如果你的 $jawaban1 字符串是

Hello <br> and welcome!

你的代码是

$breaks = array("<br />", "<br>", "<br/>"); 
$jawaban = str_ireplace($breaks, "&#13;&#10;", $jawaban1);

这意味着,$jawaban 将是这样的:

Hello &#13;&#10; and welcome!

没有任何\n\r,只有您的浏览器显示如下:

Hello \n\r and welcome!

如果您想用 \n\r 替换所有 br,只需使用问题中的代码:

$breaks = array("<br />", "<br>", "<br/>");
$text = str_ireplace($breaks, "\r\n", $text);

关于 preg_replace()

当你可以使用 str_ireplace 时,不要使用 preg_replace。 str_ireplace 更快。

不需要就不要做

在你的代码中你这样做了:

$unsafejawabanfirst = nl2br($jawabannotcut);

然后你想用\n\r替换br。这就像做和撤消。我看到您正试图在 textarea 元素中再次显示它。所以不要用 br 替换 \n\r。解决方案?根本不要更改 \n\r,如果要将其保存到数据库,只需使用 \r\r 保存即可。当您需要它在 textarea 元素之外 显示 时,只需使用 nl2br 函数即可。

【讨论】:

    【解决方案4】:

    总有一些事情可以挽救我的一天,这实际上是一种解决方法,您的问题是我深入研究此事的触发因素 - 一劳永逸。

    现在,给你 - 不错的解决方法:

    已经有nl2br() 函数替换在换行符之前插入&lt;br&gt; 标记:

    示例(键盘):

    <?php
        // Won't work
        $desc = 'Line one\nline two';
        // Should work
        $desc2 = "Line one\nline two";
        echo nl2br($desc);
        echo '<br/>';
        echo nl2br($desc2);
    ?>
    

    【讨论】:

    • 好吧,我用了“不是”,但还是不行,谢谢你的信息
    猜你喜欢
    • 1970-01-01
    • 2011-06-16
    • 1970-01-01
    • 2014-04-08
    • 1970-01-01
    • 1970-01-01
    • 2013-03-22
    • 2020-05-24
    • 1970-01-01
    相关资源
    最近更新 更多