2

「To」で始まるテキストエリアの投稿結果から1行を削除しようとしています。

$var = 'Date: __date\n"."Mime-Version: 1.0\nFrom: __From \nTo: __To\nSubject: __Subject         \nReply-To: __Reply-To\nX-Job: __X-Job';

$text = preg_replace("/To(.*)$\n/s","",$var);

しかし、それは機能しませんでした。

この出力が欲しい

Date: __date\n"."Mime-Version: 1.0\nFrom: __From \nSubject: __Subject         \nReply-To: __Reply-To\nX-Job: __X-Job'

編集:入力がtextareaからのものであることを考慮した、私が使用した最後のソリューション

        $text = preg_replace("/To.*?Subject:/s","Subject:",$var);
4

3 に答える 3

1

\nand修飾子を使用しない最初の解決策、最初に問題の説明:

$text = preg_replace("/To.*?Subject:/","Subject:",$var);

これは、末尾\nを区切り記号として使用する、より一般的なバージョンです。

$text = preg_replace("/\bTo:.*?\n/", "", $var, 1);
  • \b単語の始まりを示す
  • .*?貪欲ではないため?、一致した場合に停止することを意味します\n
  • 最終的には、1 つ (最初の) 出現のみを置き換えるように1指示され ます (最初は忘れていましたが、デフォルトはすべてです - PHPPerlではありません..)preg_replace

注:単一引用符が使用されているため、php では as CR$var = ' x\n y\n';は展開されません。二重引用符を使用する必要があります: getと別の行に。\n'$var = " x\n y\n";xy

--

(実際には、より正確に/\bTo:.*\n/は、s修飾子が使用されていないため、.*は と一致しません\ns修飾子が.に一致し\n?が必要です/\bTo:.*?\n/s。しかし、?とにかく と一緒に使用する方が明確であり、より良いこの便利なオプションを忘れないでください!)

于 2013-01-23T12:37:00.243 に答える
1

が各行の先頭に一致する/mように修飾子が必要です。次に、次の式を使用します。^

$text = preg_replace("/^To:.*/m", "", $var);

修飾子は使用していません。これは、改行にも一致/sするためです。これは、ここで必要なものではありません。.

デモ

ところで、仕様によると、MIME ヘッダーは複数の行にまたがる場合があります。この回答ではそれを無視しています:)

于 2013-01-23T12:44:59.517 に答える
0

爆発を使用してみてください:

$var = 'Date: __date\n"."Mime-Version: 1.0\nFrom: __From \nTo: __To\nSubject: __Subject         \nReply-To: __Reply-To\nX-Job: __X-Job';
$arr = explode('\n', $var);

必要なキーの設定を解除します

于 2013-01-23T12:38:52.840 に答える