我有以下 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: 之后和之前的部分?
- 身体
- 主题
任何有关正则表达式的帮助将不胜感激。提前致谢。
第二部分不需要正则表达式。它可以被解析为查询字符串,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 链接:
// $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
,后跟一个捕获组(括号),其中包含.
一次或多次+
非贪婪的任何字符(? - 这将使捕获尽可能短)后跟一个(转义)问号(\?
)