[英]preg_match to extract mailto on anchor
我需要从带有regex的mailto属性的锚中获取电子邮件地址。
此模式: (.*)<a\\s(.*?)(.*)\\s*href\\=['"]mailto:([-a-z0-9_]+)@([a-z0-9-]+).([az]+)['"]>(.*)</a>(.*)
尽管它不适用于PHP,但可以在regex coach中工作。
码:
preg_match("'(.*)<a (.*?)(.*) *href\=['\"]mailto:([-a-z0-9_]+)@([a-z0-9-]+).([a-z]+)['\"]>(.*)</a>(.*)'si", "<a href=\"mailto:someemail@ohio.com\"">Some email</a>", $matches);
print_r($matches);
那么为什么要在php中起作用呢?
PHP的PCRE要求将正则表达式包装到分隔符中 ,以将模式与可选修饰符分开。 在这种情况下,将使用第一个非字母数字字符(即'
),因此模式实际上只是(.*)<a (.*?)(.*) *href\\=[
,其余部分视为修饰符。 这是一个无效的正则表达式,因为[
没有正确地转义,其余的都不是有效的修饰符。
正如其他人已经建议的那样,您可以通过在正则表达式中转义分隔符'
任何出现来解决此问题,或者选择一个不在正则表达式中出现的分隔符。
但是除此之外,尝试使用正则表达式解析HTML非常容易出错。 在这种情况下,使用那么多.*
也会导致可怕的性能行为(这仅是由于正则表达式的处理方式所致)。
最好使用适当的HTML解析器来返回可以像PHP的DOM库一样查询的DOM :
$doc = new DomDocument();
$doc->loadHTML($str);
foreach ($doc->getElementsByTagName("a") as $a) {
if ($a->hasAttribute("href")) {
$href = trim($a->getAttribute("href"));
if (strtolower(substr($href, 0, 7)) === 'mailto:') {
$components = parse_url($href);
}
}
}
您的定界符是一个引号'
,并且在正则表达式中有一些实例:
preg_match("'(.*)<a (.*?)(.*) *href\=['\"]mailto:([-a-z0-9_]+)@([a-z0-9-]+).([a-z]+)['\"]>(.*)</a>(.*)'si", "<a href=\"mailto:someemail@ohio.com\"">Some email</a>", $matches);
^ ^
转义它们(即: \\'
)或更改定界符。
if (preg_match('#<a\s.*?href=[\'"]mailto:([A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,6})[\'"].*?>.*?</a>#i', $subject, $regs)) {
$result = $regs[0];
} else {
$result = "";
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.