1

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

4 回答 4

2

第二部分不需要正则表达式。它可以被解析为查询字符串,IMO。

类似于:($shref以下代码中的值)

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";

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

于 2012-06-30T09:00:08.317 回答
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完成其余部分。

于 2012-06-30T09:05:44.100 回答
1

没有在 PHP 中尝试过,但在Regex Hero中可以正常工作:

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

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

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

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

于 2012-06-30T09:04:11.167 回答
-1

尝试这个

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

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

于 2012-06-30T08:48:22.043 回答