PHPのにpreg_replaceで複数の発生を置き換えるための正しい構文
-
18-09-2019 - |
質問
私は、同様のアイデアをスタックオーバーフローから他の質問の上に行ってきたが、どれも私が何をしようとしている密接に十分に似ているように思えません。
簡単なようだが、私はピクルスにいますよ。
人々は一度に複数の改行を提出することができませんので、私は、唯一の改行と改行(\n
)の複数の発生を置き換えるためにしようとしています。
ここで私が試したものです。
$text = "Foo\n\n\nbar!\n\nfoobar!";
$text = preg_replace("#\n+#", "\n", $text);
echo $text;
期待返さ声明は次のようになります:
Foo\nbar!\nfoobar!
しかし、なし葉巻! 私はいくつか試したが、どれも動作するように見えません。
私が間違って何をしているのですか?
ありがとうございます。
解決 3
あなたは、溶液中だけ興味があるなら、最後の行にスキップします。
ここで起こってしまったものです。私は、特定の情報が含まれてHTMLでdiv
タグを持っていました。
ユーザーがボタンを押したときは、JSコードは、それがdiv
テキストボックスにそのinput
を変換し実行し、元のdivのhtmlとしてそのテキストボックスの値を設定します - 実際の改行を作成するために<br>
で\n
のすべての出現を交換しながら。
フォームは、サーバーにAJAXを経由して提出してしまっています。
、上記の提案はいずれも、それはなかったという単純な理由(妙に十分な)「本当の」改行文字のために、助けません。サーバーに送信得たものリテラル\n
でした。
あなたはghostdog74により示唆されるように、\n
にバックスラッシュをエスケープしても問題が解決するだろうと思うだろうが、それはしませんでした。私はそれをいくつかの異なる方法を脱出しようとしたが、何も役立つように見えません。
私はいくつかの古い正規表現材料を参照することになったと見られるます:
多く味も\ Q ... \ Eエスケープシーケンスをサポートしています。 \ Qと\ Eの間のすべての文字がリテラル文字として解釈されます。例えば。 \ Q * \ D + * \ Eは、の\ dは+ のリテラルテキストと一致しました。 \ Eは、正規表現の末尾に省略することができる...この構文はJGsoftエンジンでサポートされ、Perlの、PCRE ... <のhref = "http://www.regular-expressions.info/characters.html "REL =" nofollowをnoreferrer "> [ソース] の
それに続いて、ここに私の問題を解決したコードの一部です:
$text = preg_replace('#[\Q\n\E]+#', "\n", $text);
あなたはすべてのあなたの助けのために皆に感謝!すべてのための+1:)
他のヒント
また、改行の3つのすべての種類をチェックすることがあります:
$text = "Foo\n\r\n\n\rbar!\n\nfoobar!";
$text = preg_replace('#(\r\n|\r|\n)+#m', "\n", $text);
echo $text;
$text = "Foo\n\n\nbar!\n\nfoobar!";
$s = split("\n+",$text);
print_r( implode("\n",$s)); #this will join the string with newline
print_r( implode("\\n",$s)); # this will have literal \n in your string