我有以下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>
从上面的字符串我想提取:
任何有关正则表达式的帮助将不胜感激。提前谢谢。
答案 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-]+=.*?))+?"
这应该会产生以下捕获组:
你可能想做一些更密集的测试,因为我不确定我是否拥有所有有效的邮件地址。
答案 3 :(得分:-1)
试试这个
$m = preg_match("/mailto:(.+?)\?/");
它匹配单词mailto
后跟冒号,后跟一个捕获组(括号),其中包含任何字符.
一次或多次+
非贪婪(? - it将使捕获尽可能短),然后是(转义)问号(\?
)