簡體   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