次の html ソース文字列があります。
<a href="mailto:abcd@test.com?body=This%20is%20the%20body%20-123-&subject=Subject%20Text&Content-Type=text/plain">Reply To Post</a>
上記の文字列から抽出したい:
- mailto: から ? までの部分のメールアドレス
- 体
- 主題
正規表現に関するヘルプをいただければ幸いです。前もって感謝します。
2番目の部分の正規表現は必要ありません。クエリ文字列IMOとして解析できます。
次のようなもの:(次のコード$s
のの値です)href
preg_match("/mailto:(.*?)\?(.*)/",$s,$matches);
echo "Email:" . $matches[1] . "\n";
parse_str($matches[2],$output);
echo "Body: " . $output['body'] . "\n";
echo "Subject: " . $output['subject'] . "\n";
実際、文字列がまったく同じように表示されることが確実な場合は、「:」のインデックスのオフセットから「?」のインデックスまでのサブ文字列を取得することもできます。
これは、mailto リンクが 1 つだけであることを前提としています。
// $str will be your string content from the question
if (preg_match('/"mailto:([^"]+?)/', $str, $matches) && false !== ($info = parse_url($matches[1]))) {
$emailAddress = $info['path'];
$emailParameters = array();
if (isset($info['query'])) {
parse_str($info['query'], $emailParameters);
}
var_dump($emailAddress, $emailParameters);
}
"mailto:
最初の終了引用符まで一致しparse_url
、残りを実行するために使用します。
PHP で試したことはありませんが、Regex Heroでは問題なく動作します:
"mailto:([\w%.+-]+?@[\w.-]+?)(?:[?&](?:body=(.*?)|subject=(.*?)|[\w-]+=.*?))+?"
これにより、次のキャプチャ グループが生成されます。
ただし、すべての有効なメール アドレスを取得したかどうかわからないため、さらに集中的なテストを行うことをお勧めします。
これを試して
$m = preg_match("/mailto:(.+?)\?/");
これは、単語のmailto
後にコロンが続き、任意の文字を.
1 回以上+
貪欲に含まないキャプチャ グループ (括弧) が続く (? - キャプチャを可能な限り短くします) と、それに続く (エスケープされた) 疑問符 ( \?
)