繁体   English   中英

preg_match以在锚点上提取mailto

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM