str_ireplace或preg_replace将break标记替换为\ r \ n

时间:2016-09-15 15:16:18

标签: php html

我已阅读this post,讨论如何将html break标记转换为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”,为什么会发生这种情况? 截图: this is picture , easter egg found !

如果有任何先前的帖子/ 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>";

注意:该代码段不起作用,因为它是php
抱歉,我在发布代码时因错误而使用了片段!

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

EASTER EGG FOUND ! CODE 404 !

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

4 个答案:

答案 0 :(得分:7)

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

echo htmlspecialchars($myUnsafeVar);

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

  • 在将字符串输入数据库时​​使用mysqli_real_escape_string。输出到屏幕时它不会达到您的预期 - 因此任何mysql转义()的内容都不应出现在屏幕上。
  • 在输出到屏幕时使用htmlspecialchars(您没有!)。
  • 使用url_encode将内容添加到网址
  • 还有许多不同的“转义”功能(例如插入JSON,插入mysql,插入其他数据库)。根据需要使用正确的 - 并且不要将其用于其他目的。

检查功能以获取更多详细信息。

目前看来,即使付出了所有努力,您的代码也不安全 - 但修复起来非常简单!

答案 1 :(得分:2)

尝试使用preg_replace()功能,您只需\n\r\n

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

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

答案 2 :(得分:2)

在使用字符串之前必须先了解这些内容:

  1. &#34; \ n \ R&#34;意味着换行。
  2. &#39; \ n \ r&#39; 表示新行。
  3. &#13;&#10; 表示新行。它只是HTML符号的HTML编号。当您使用它时,您的意思是只需在您的浏览器中显示\ n \ r \ n。这是你的问题的答案:
  4.   

    插入&#34; \ r \ n&#34;在文中,为什么会发生这种情况?

    所以,在了解之后,您明白了:

    如果你的$ 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 \ n,只是您的浏览器显示如下:

    Hello \n\r and welcome!
    

    如果你想用\ n \ r \ n替换所有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 \ n \ n替换br。它就像做和撤消一样。我看到你试图在textarea元素中再次显示它。所以不要用br代替\ n \ r。解决方案?根本不要改变\ n \ r \ n如果你想将它保存到数据库,只需用\ r \ n \ r保存它。当你需要它来显示在textarea元素之外时,只需使用nl2br函数。

答案 3 :(得分:-2)

总会有一些东西可以挽救我的一天,这实际上是一种解决方法,而你的问题是让我更深入地了解这件事 - 一劳永逸。

现在,你走了 - 好看&amp;圆滑的解决方法:

已有nl2br()函数替换新行字符前的<br>标记:

示例(键盘):

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