doumi5223 2010-11-23 16:38 采纳率: 100%
浏览 102
已采纳

preg_match在锚点上提取mailto

I need to get the email adress from an anchor with a mailto attribute with regex.

this pattern: (.*)<a\s(.*?)(.*)\s*href\=['"]mailto:([-a-z0-9_]+)@([a-z0-9-]+).([a-z]+)['"]>(.*)</a>(.*)

Works in regex coach though it doesnt work with PHP.

Code:

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

So why doenst it work in php?

  • 写回答

3条回答 默认 最新

  • dr6673999 2010-11-23 16:55
    关注

    PHP’s PCRE require the regular expression to be wrapped into delimiters that separate the pattern from optional modifiers. In this case the first non-alphanumeric character is used (i.e. ') so the pattern is actually just (.*)<a (.*?)(.*) *href\=[ and the rest are treated as modifiers. And that is an invalid regular expression as the [ is not properly escaped and the rest are not valid modifiers neither.

    As the others have already suggested, you can fix this by escaping any occurrence of the delimiter ' inside the regular expression or choose a different delimiter that does not appear in the regular expression.

    But besides that, trying to parse HTML with regular expressions is very error prone. In you case using that many .* will also result in a horrible performance behavior (it’s just due to how regular expressions are processed).

    Better use a proper HTML parser that returns a DOM that can be queried like PHP’s DOM library:

    $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);
            }
        }
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥15 聚类分析或者python进行数据分析
  • ¥15 逻辑谓词和消解原理的运用
  • ¥15 三菱伺服电机按启动按钮有使能但不动作
  • ¥15 js,页面2返回页面1时定位进入的设备
  • ¥50 导入文件到网吧的电脑并且在重启之后不会被恢复
  • ¥15 (希望可以解决问题)ma和mb文件无法正常打开,打开后是空白,但是有正常内存占用,但可以在打开Maya应用程序后打开场景ma和mb格式。
  • ¥20 ML307A在使用AT命令连接EMQX平台的MQTT时被拒绝
  • ¥20 腾讯企业邮箱邮件可以恢复么
  • ¥15 有人知道怎么将自己的迁移策略布到edgecloudsim上使用吗?
  • ¥15 错误 LNK2001 无法解析的外部符号