0

テキストの文字列があり、それから PHP 正規表現を使用して URL を取得します。リンクはいくつでもある可能性があるので、私は使用しています

 preg_match_all

問題は、何らかの理由で 1 つのリンクを挿入すると、3 つあると考えられることです。配列を一意にすると、中間の値は除外されますが、最後の値は除外されません。

ここに以下のコードがあります

 $bodyMessage = imap_body($hMail,$idxMsg);
 $bodyMessage = quoted_printable_decode($bodyMessage);

 preg_match_all('((https?|ftp|gopher|telnet|file|notes|ms-help):((//)|(\\\\))+[\w\d:#@%/;$()~_?\+-=\\\.&]*)', $bodyMessage, $matches, PREG_PATTERN_ORDER);
 $links = array_unique($matches[0]);
 print_r($links); 

print_r($links) の出力は次のとおりです。

 Array ( [0] => http://usnews.msnbc.msn.com/_news/2012/07/20/12861792-6-year-old-girl-confirmed-to-have-been-killed-in-colorado-theater-shootings?lite 
 [2] => http://usnews.msnbc.msn.com/_news/2012/07/20/12861792-6-year-old-girl-confirmed-to-have-been-killed-in-colorado-theater-shootings?lite

解析する電子メールの本文は次のとおりです。

 --20cf300e4d7d02c34004c55e1489 Content-Type: text/plain; charset=ISO-8859-1 @bill http://usnews.msnbc.msn.com/_news/2012/07/20/12861792-6-year-old-girl-confirmed-to-have-been-killed-in-colorado-theater-shootings?lite --20cf300e4d7d02c34004c55e1489 Content-Type: text/html; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable @bill 

何か案は?ありがとう!

編集:

私はトリミングによって提案に従いました、そしてそれは空の配列を返します

 function trims($l){
                    trim($l);   
                }
                $links = $matches[0];
                $trimmedLinks = array_map("trims", $links);
                $trimmedLinks = array_unique($trimmedLinks);
                print_r($trimmedLinks); // = Array ( [0] => ) 

編集:

これは、imap から本文メッセージを取得することに関係している可能性があると思います。imap からテキストの文字列をコピーして貼り付け、その = を $bodyMessage に設定すると、機能します...

4

1 に答える 1

2

このようなパターンがあるはずです

((?:https?|ftp|gopher|telnet|file|notes|ms-help):(?:(?://)|(?:\\\\))+[\w\d:#@%/;$()~_?\+-=\\\.&]*)

非キャプチャ グループで。?: を括弧で囲むと、非キャプチャ グループが取得されます。そして、配列は次のようになります。

Array ( [0] => http://usnews.msnbc.msn.com/_news/2012/07/20/12861792-6-year-old-girl-confirmed-to-have-been-killed-in-colorado-theater-shootings?lite )

編集: この問題に対する答えは、代わりに imap_fetchbody を使用することです

于 2012-07-21T22:18:34.583 に答える