web-dev-qa-db-ja.com

\ r \ nをPHP

MySQLデータベースにテキストを挿入する投稿フォームがあります。

私が使う

$post_text = mysql_real_escape_string(htmlspecialchars($_POST['text']));

自動的に追加された\r\nを置き換えたい場合。

私は試した

$text = str_replace('\\r\\n','', $text);
$text = str_replace('\r\n','', $text);
$text = str_replace('\\R\\N','', $text);
$text = str_replace('\R\N','', $text);
$text = str_replace('/\r\\n','', $text);
$text = str_replace('/r/n','', $text);
$text = str_replace('/\R\\N','', $text);
$text = str_replace('/R/N','', $text);

ただし、\r\nは常にデータベースエントリに含まれます。

どうすれば修正できますか?

32
njaknjak

あなたが試したすべてのバリエーションに伴う主な問題は、\n\rの両方が、ダブルで使用する場合にのみエスケープされるエスケープ文字であるということです。 -引用符付き文字列

PHPでは、'\r\n'"\r\n"には大きな違いがあります。最初の引用符に注意し、2番目の二重引用符に注意してください。

'\r\n'は、スラッシュ、 'r'、別のスラッシュ、および 'n'を含む4文字の文字列になりますが、"\r\n"は、改行とキャリッジリターンの2文字を含みます。文字。

あなたの質問に対する直接的な答えは、あなたが質問で与えた2番目の例を使用する必要があるということですが、一重引用符の代わりに二重引用符で:

$text = str_replace("\r\n",'', $text);

これにより、入力からallの新しい行が削除され、何も置き換えられないことに注意してください。入力に複数の新しい行がある場合、それらはすべて削除されます。あなたのアプリケーションについてもっと知ることなく、これがあなたが望むものかどうかはわかりませんが、ここにいくつかの考えがあります:

  • 入力文字列のendから空白行(およびその他の空白)のみを削除する場合は、trim()を使用できます。代わりに機能します。

  • HTMLへの出力のフォーマットを保持する場合は、nl2br()関数が役立ちます。書式設定なしでHTMLに出力する場合、ブラウザは\ n文字からの改行をレンダリングしないため、それらを削除する必要はありません。

  • 例のように新しい行を何も置き換えない場合、最初の行の最後の単語が2行目の最初の単語に直接移動するようになります。空白ではなくスペース文字で置き換えることをお勧めします。

  • ユーザーは、一致する\nなしで\rのみ、またはその逆(これは、OSまたはブラウザー、意図的なハック、または他の多くの理由による可能性があります)理由)。これらの両方の文字のallインスタンスを置換したい場合、より信頼できる方法は、それらに依存するのではなく、個別に置換することです隣同士に。 str_replace()では、配列で指定することでこれを行うことができます。 strtr()またはpreg_replace()を使用して同じ目標を達成することもできます。

それが役に立てば幸いです。

59
Spudley

またやってみて

$text = str_ireplace(array("\r","\n",'\r','\n'),'', $text);
11
   if (!is_numeric($value)) {
        $value = mysql_real_escape_string(trim($value));
        $value = str_replace("\\r\\n",'', $value);
    }
5

データベースエントリを処理するときは、複数の置換にstrtr()を使用することをお勧めします。 @Spudleyが提案したように、二重引用符も使用します。

$text = strtr($text, array(
          "\r\n" => "",
          "\r" => "",
          "\n" => "",
          "\t" => " "));

strtr()->部分文字列が置換されると、新しい値は再び検索されません。

http://php.net/strtr

str_replace()-> searchが配列でreplaceが文字列の場合、この置換文字列はsearchのすべての値に使用されます。ただし、その逆は意味がありません。

http://php.net/str_replace

2
fat_mike

複数の改行を保持するには、これをやっています:

$tempCONTENT = mysqli_real_escape_string($con, $_POST['promotion_content']);
$tempCONTENT = str_ireplace(array("\r\n","\r","\n",'\r','\n'),'<br />', $tempCONTENT);
$previewFORMATTED = str_ireplace(array('<br /><br />'),'<br />', $tempCONTENT);
echo $previewFORMATTED;

これは、テキストエリアのフォームフィールドを処理するために使用されています。ユーザーが入力した改行の数を保持し、\ r\nから[br /]に変更します。

データベースに追加する前にユーザーが確認できるように、これを使用して入力を表示しています。確認用と送信用の2つの送信ボタンを使用しても、これは実行されません。 mysqli_real_escape_stringを使用してデータを追加するだけです

次に、str_ireplaceを使用して[br /]の正しい数を\ r\nに戻すので、結果をテキストエリアにエコーバックして、編集しやすくします。

したがって、最終的なコードは次のようになります。

$tempCONTENT = mysqli_real_escape_string($con, $_POST['promotion_content']);
$tempCONTENT = str_ireplace(array("\r\n","\r","\n",'\r','\n'),'<br />', $tempCONTENT);
$previewFORMATTED = str_ireplace(array('<br /><br />'),'<br />', $tempCONTENT);
echo $previewFORMATTED;
$formOUTPUT = str_ireplace(array('<br />'),"\r\n", $previewFORMATTED);

これをSafariとChromeでテストしました。正常に動作します。IEのテストは行っていませんが、IEでは何も動作しません!

しかし、私は別の問題を見つけました。ユーザーが次のようなHTMLを入力した場合:

<h1>heading</h1><p>some text</p>

それは問題ありませんが、彼らが次のことをした場合(より可能性が高い)

<h1>heading</h1>
<p>some text</p>

次に、見出しと段落の間に大きなスペースができます。

私はこのコードで修正しようとしました:

$tempCONTENT = str_ireplace(array(">\r\n<",">\r<",">\n<",'>\r<','>\n<'),'><', $tempCONTENT);

しかし、それはうまくいきませんでした:( h1とpタグの間に余分な[br /]を追加しているので、まだ大きなギャップがあります。

とりあえず、htmlタグの間に改行を追加しないように伝えます。結果は良好です:)

誰かがこれが役に立つことを願っています。

0
Steve Hall