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