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
は常にデータベースエントリに含まれます。
どうすれば修正できますか?
あなたが試したすべてのバリエーションに伴う主な問題は、\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()
を使用して同じ目標を達成することもできます。
それが役に立てば幸いです。
またやってみて
$text = str_ireplace(array("\r","\n",'\r','\n'),'', $text);
if (!is_numeric($value)) {
$value = mysql_real_escape_string(trim($value));
$value = str_replace("\\r\\n",'', $value);
}
データベースエントリを処理するときは、複数の置換にstrtr()を使用することをお勧めします。 @Spudleyが提案したように、二重引用符も使用します。
$text = strtr($text, array(
"\r\n" => "",
"\r" => "",
"\n" => "",
"\t" => " "));
strtr()->部分文字列が置換されると、新しい値は再び検索されません。
str_replace()-> searchが配列でreplaceが文字列の場合、この置換文字列はsearchのすべての値に使用されます。ただし、その逆は意味がありません。
複数の改行を保持するには、これをやっています:
$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タグの間に改行を追加しないように伝えます。結果は良好です:)
誰かがこれが役に立つことを願っています。