[PHP-users 8577] Re: 正規表現関数について

Mashiki php-users@php.gr.jp
Thu, 11 Jul 2002 00:56:12 +0900


 Mashikiです。

>----------Perl--------------
>1.$address=~ /\nFrom:[ \t]*(.+)/i;
>2.$address=~
>/[0-9A-Za-z\-]+[\-\.\w\/]*\@([0-9A-Za-z]+[\-\w]*\.){1,4}[0-9A-Za-z]+/
>
>1."From:"キーワードにより$addressに文字列をセット
>2.取り出した文字列より正当性のある文字のみ抽出
>---------------------------
>
>上記をphpにしたいのです。
>phpマニュアルをみて1番目をとりあえず実行したくて下記にしました。
>fopen()関数にてメールを読み込み
>-------------php--------------
>if (ereg ("/\nFrom:[\t]*(.+)/i",$mail,$regs)){
>print($regs[0]);
>}else{
>print("???");}
>endif;
>------------------------------
>としてみました。
>???と表示され認識されていませんでした。
>phpで使えない表現が含まれている様に思えますがphp向けに詳しく解説されたものが
>見つかりませんでしたのでご質問させていただきたく、よろしくお願いいたします。
>
>環境はphp4.2.1+VineLinux2.1.5です。


アドバイス

0. 言葉遣いは汚いですが、気にしないでくださいね。
1. endifはVBだ。使うな!
2. iオプションの代わりにeregi関数を使え!
3. /  /で囲うな!
4. (.+)だと改行以降も全部持ってくる。([^\n].)を使え!
5. 成功時、regs[0]を表示するとがっかりする。取り出したいサブパターンが
 何番目の()でくくられているか数えろ。phpのマニュアル読め!
6. ここのMLのようにいきなりFrom:が始まる場合がある、
  \nFrom:だけでなく、^From:も引っ掛けろ!
7. 目的の文字列は< >で囲まれている場合があるので、確認のためのprint
 なら、htmlspecialcharsをかます
8. phpのマニュアルだけでなく正規表現のドキュメントも読め!
9. fopen()で読んだという$mailの内容も確認しろ。なんかあやしい
10. 1番目のサンプルをphpにしてみた。2はぜひともがんばってくれ!!

----------------------------------------SCRIPT開始
<html><body><pre>
<?php
// fopenで読んでるらしいけど、まあhereドキュメントで
	$mail=<<< END_OF_MAIL
From:	"AriAri" <ariaricom@ybb.ne.jp>
Reply-To: php-users@php.gr.jp
To:		"メーリングリスト php" <php-users@php.gr.jp>
Subject:	[PHP-users 8479] 正規表現関数について
Date:	Sun, 7 Jul 2002 10:55:20 +0900
Received: from ns1.php.gr.jp (ns1.php.gr.jp [210.171.55.29])
	by msvp11.rimnet.ne.jp (8.9.3/3.7Wpl2) with ESMTP id KAA70831
	for <mashiki@yanah.com>; Sun, 7 Jul 2002 10:56:18 +0900 (JST)
Received: from ns1.php.gr.jp (localhost [127.0.0.1])

一部のヘッダーと本文省略

END_OF_MAIL;

	if (eregi("(^|\n)From:[\t ]*([^\n]+)",$mail,$regs)) {
		$from = $regs[2];
		echo htmlspecialchars("$mail\n\nFrom=$from");
	}else{
		print("???");
	}
?>
</pre></body></html>
----------------------------------------SCRIPT終了