php正则表达式解析mailTo

时间:2012-06-30 08:39:38

标签: php regex

我有以下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>

从上面的字符串我想提取:

  1. 电子邮件地址是mailto:之前和之前的部分?
  2. 主题
  3. 任何有关正则表达式的帮助将不胜感激。提前谢谢。

4 个答案:

答案 0 :(得分:2)

第二部分你不需要正则表达式。 IMO It can be parsed as a query string

类似于:($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";

实际上,如果您确定字符串以完全相同的方式出现,您可以将索引偏移量为“:”的子字符串转换为索引“?”。

答案 1 :(得分:2)

这将假设您只有一个mailto链接:

// $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完成其余的工作。

答案 2 :(得分:1)

没有在PHP中尝试过,但它在Regex Hero中运行良好:

"mailto:([\w%.+-]+?@[\w.-]+?)(?:[?&](?:body=(.*?)|subject=(.*?)|[\w-]+=.*?))+?"

这应该会产生以下捕获组:

  • 1:电子邮件地址
  • 2:身体
  • 3:subject

你可能想做一些更密集的测试,因为我不确定我是否拥有所有有效的邮件地址。

答案 3 :(得分:-1)

试试这个

$m = preg_match("/mailto:(.+?)\?/");

它匹配单词mailto后跟冒号,后跟一个捕获组(括号),其中包含任何字符.一次或多次+非贪婪(? - it将使捕获尽可能短),然后是(转义)问号(\?