• 締切済み

正規表現について

今現在、PHPの勉強をしているのですが preg_match("/\nFrom:\s*(.+)\r/i", $sss, $aaaa) という文字列が出てきて困っています。 preg_match関数における\nFrom:とは一体何なんでしょうか。教えてください。

  • PHP
  • 回答数2
  • ありがとう数0

みんなの回答

回答No.2

おはようございます。 恐らく、メールヘッダーからメールアドレスを抽出しているのですね。 正規表現は区切り文字//で囲みます(|等でも可能)。 \nは改行、つまり改行の後のFrom:、と言う意味です。 \sはスペースです、*はスペースがあっても無くても良い、と言う意味です。 (.+)は、任意の文字列の繰り返し、と言う意味です。 \rはリターンですね。 最後のiは、大文字小文字を区別しない、というパターン修飾子です。 ()は括弧内を抽出するということですから、まとめると、文字列$sssの中の改行の後のFrom:に続く文字列をリターンまで抽出して$aaaaに代入、と言う事です。 詳細はpreg_match、パターン構文等のマニュアルを参照してみてください。 http://jp2.php.net/preg_match http://jp2.php.net/manual/ja/reference.pcre.pattern.syntax.php 正規表現は、最初とてもなじみにくく、奥が深いですが、ある程度覚えるとこんなに便利なモノは。。。と感じるようになると思いますよ。

noname#77845
noname#77845
回答No.1

\n は改行を表していませんか? なので、「\nFrom」 で改行の次のFrom→「先頭のFrom」 を表しています。

関連するQ&A

  • 正規表現のコーディングについてお願いします。

    こんにちは、よろしくお願いいたします。 正規表現パターンを書く場合に皆さんがどのようにされているか教えてください。 例えば(ちょっとムリヤリ感が強いですが)、'Price \5800-' という文字列の \5800 の部分に preg_match でマッチさせたいとします。 単純に考えると、 /\\\d+/ のようなパターンが思いつくのですが、それを文字列として preg_match に渡す際に、コードはどのように書かれますか? <?php   $str = 'Price \5800-';   //とりあえず、'/\\\d+/' と書き、'/\\\\\\d+/' と、\ をそれぞれの \ に書き足す   if ( preg_match('/\\\\\\d+/', $str, $match) ) {     print_r($match);   } ?> 「まず、パターンを書き、全ての \ の前に \ を書き足す。」というのが無難なのかな?と思い、そうしていますが、 そういった考え方で間違っていないでしょうか? どうぞよろしくお願いいたします。

    • 締切済み
    • PHP
  • 文字列全体に対する置き換え [正規表現]

    正規表現での文字列全体に対する、マッチ箇所 への置き換えについて、アドバイスをもらえないでしょうか。 parlでいうg修飾子はphpには無く、 例えば、[preg_match]は[preg_match_all]という関数で対応出来ますが、 置き換えを行う[preg_replace]には[preg_replace_all]がありません。 それに類する関数も無いように思います。 これに関して、PHPではどのように対応すれば良いのでしょうか。

    • ベストアンサー
    • PHP
  • 正規表現について

    PHP5.2.4を使用しています。 任意の数の引数がある文字列をpreg_matchを使ってマッチさせたいのですが、 例えば"ENUM(ab,cd)"は ab と cd の2つの引数があるとします。 次のようなパターン文字列まではアイデアとして浮かんだのですが、 引数の最後は , がないので当然ですがマッチしません・・・ どのようにパターン文字列を記述すれば良いのでしょうか? $str = "ENUM(ab,cd)"; if (preg_match("/ENUM\(([^\,]+\,)+\)/", $str, $match)) { print "{$match[0]}<br>\n"; }

    • 締切済み
    • PHP
  • 正規表現での改行数を求めるにあたって

    以下の文字列がフォームからPOSTされたとします。 ------------------- 1 2 3 4 5 ------------------- ポストされた文字列が$strに格納されているとして、 以下を実行しました。 ------------------- print preg_match_all("[\n\r]", $str, $dummy); print preg_match_all("[\r\n]", $str, $dummy); print preg_match_all("[\r]", $str, $dummy); print preg_match_all("[\n]", $str, $dummy); ------------------- 結果はこうなりました。 ------------------- 6 6 10 10 ------------------- どうやらマッチパターンが"[\n\r]"と"[\r\n]"の場合は空白行の数を、 "[\r]"と"[\n]"の場合は純粋に改行数を返しているようです。 どうしてこのような差が出るのでしょうか? 文字コードはEUC、改行コードはLFで統一していますが関係ありますか?

    • 締切済み
    • PHP
  • 正規表現パターン'/^[a-z0-9]+$/iD' の最後の"D"について

    こんにちは。今PHPの勉強をしているものです。 勉強中、ctype_alnum()という関数がわからなかったのでPHPマニュアルで調べたら、「この関数は preg_match('/^[a-z0-9]+$/iD', $text) と等価です。」と書いてありましたが、英字または 数字であるかどうかを調べるのなら、パターンは'/^[a-z0-9]+$/i'だけでいいと思いますが、最後のDはいったいなんなのでしょうか?修飾子で調べて見ましたがDなどといったものは見当たりませんでした。どなたか教えていただけませんか。

    • ベストアンサー
    • PHP
  • 正規表現で切り出せません。 < と > の間?

    宜しくお願いいたします。 PHP5.1.6です。 メールの受信をするときにメールアドレスだけを切り出したいのですが うまく出来ません。 【例-1】の様に、すると < > の間が表示するのですが 【例-2】の例のように、変数を入れると何も表示しません。 【例-1】で使用した文字列は、【例-2】の$from を echo で表示させたものをコピーしています どのようにしたらいいでしょうか? 宜しくお願いいたします。 【例-1】 $test="教えてお名前 <****@*******.com>"; $pattern = "<(.*)>"; if (preg_match( "/".$pattern."/i", $test, $match ) ){ //$from0 = $match[0]; $from1 = $match[1]; //echo $from0; echo $from1; } これで、うまく echo $from1 でメールアドレスだけ表示してくれます。 *** なぜか、$from0 には元の文字列は表示しませんが。 置き換える元の文字列を下記変数に変えると表示しません。 【例-2】 $mboxes = imap_check($mbox); $head = imap_header($mbox, $i); $from = htmlspecialchars(mb_decode_mimeheader($head->fromaddress)); $pattern = "<(.*)>"; if (preg_match( "/".$pattern."/i", "$from", $match ) ){ //$from0 = $match[0]; $from1 = $match[1]; //echo $from0; echo $from1; } **$from の所は "" で囲んだり、外したりしましたが一緒でした。

    • ベストアンサー
    • PHP
  • PHPにおける正規表現について

    PHPにおける正規表現について ご教授ください。 いわゆる、対象の文字列が複数行にわたっていた場合のことです。 $data = <<< EOF ABCDE FGH EOF; $hoge = preg_match("/EF/" ,$data,$match); と上記のようなコードがあった場合 対象の文字列群から【EF】という文字列を検索したい場合、どのように記述したら 【E(間に改行)F】の文字列と一致させる事ができるでしょうか? 仮に正規表現の修飾子の【s】や【m】を用いても上記の例の場合 一致させることができないと思います。 やはり、対象の文字列群 $data の改行文字をいったん削除したものから検索 するのがベターでしょうか? 正規表現に造詣の深い方よろしくご教授ください。

    • ベストアンサー
    • PHP
  • 、"(ダブルクォーテーション)で囲まれている文字列を正規表現で取得

    質問させてください。 abcdef -s "xsalkjsdflsd#$%_asdasdlasdlakjsd&=Daskdjh" asdakjsd のような文字列があります。 これの、"(ダブルクォーテーション)で囲まれている文字列を取得したいのですが、正規表現がうまくいきません。 取得結果としてはは、xsalkjsdflsd#$%_asdasdlasdlakjsd&=Daskdjh の部分がほしいです。 preg_match('/"([.*])"/', $str, $matches);とやったり preg_match('/\"([.*])\"/', $str, $matches);とやったり preg_match('/\"([.*?])\"/', $str, $matches);とやったりしたのですが、 どうしても$matchesにほしい結果は入っていません。 どのような正規表現で取得可能でしょうか? 何卒ご教授ください。

    • ベストアンサー
    • PHP
  • 正規表現の「^」と「$」がうまくいかない

    正規表現の「^」と「$」を使うとうまく働いてくれません。 あるデータの中の、行頭がhttpで始まる1行を取り出したいです。 あるデータ$dataを preg_match_all("/^http(.*?)$/",$data,$result); print_r($result); で出力すると、 ■結果 Array ( [0] => Array ( ) [1] => Array ( ) ) となり、うまくいきません。 preg_match_all("/http(.*?)\n/",$data,$result); やけでこんな感じにやったら、行頭から始まるhttp.....も行頭からはじまらないものもゲットしてすべて出力してくれてしまいます。 行頭から始まるものだけを出力するにはどうしたらいいでしょうか。 php5 UTF-8環境

    • ベストアンサー
    • PHP
  • 文字列検索の関数

    PHP初心者です。 今、文字列$strに使われている文字をチェックして、エラーのときはその文字を表示させたいと思っています。 文字列 $strに特定の文字(B,Z,J,O,X,*)が入っていたらエラーで、エラーになった文字を表示させたいと思っています。このとき、使用する関数はpreg_match_allでいいのでしょうか。 今は、下記のように書いています。 if(preg_match_all("/[B,Z,J,O,X,*]/i",$aaseq[$i],$moji[$i])){     ほかに適当な関数あるでしょうか。

    • ベストアンサー
    • PHP

専門家に質問してみよう