PHP 从电子邮件正文中取消订阅 URL
PHP Get unsubscribe URL from email body
我有一封电子邮件的 HTML 正文。我只需要从中解析取消订阅 link。
因此,如果在 dom 中的任何一点有某种 link,包含单词 Unsubscribe,
我需要 return 那个特定 link 的 URL。
我尝试了不同的正则表达式,但我似乎无法找到取消订阅 URL 或有时根本找不到。
$regexp = "<a\s[^>]*href=(\"??)([^\" >]*?)\1[^>]*>(.*(?:unsubscribe).*)<\/a>";
preg_match_all("/$regexp/iU", $body, $matches);
var_dump($matches);
这不起作用:/
谢谢
我无法仅使用正则表达式快速找到解决您的问题的方法,所以我希望您能接受比正则表达式更多 PHP 的用法。
这是我想出的:
$regexp = '<a\s+(?:[^>]*?\s+)?href=[\'|"]([^"\']*)[\'|"]>(.*?)<\/a>';
preg_match_all("/$regexp/i", $body, $matches);
$urls = $matches[1];
$tagContents = $matches[2];
$unsubscribeUrls = [];
for ($i = 0; $i < count($tagContents); $i++) {
if(!isset($urls[$i]) || !isset($tagContents[$i])){
continue;
}
if(stripos($tagContents[$i], "unsubscribe") !== false){
$unsubscribeUrls[] = $urls[$i];
}
}
var_dump($unsubscribeUrls);
这将首先匹配所有 a
标签并将它们拆分为 URL 和标签内容。然后,使用 PHP,它将检查标签的内容是否包含“取消订阅”。如果是,它将被添加到 $unsubscribeUrls
变量中。此变量应包含您需要的所有 URL。
您可以使用 DOMXpath 并检查锚点是否包含不区分大小写的取消订阅匹配项,并使用 getAttribute 获取 url 以获取 href
的值。
$data = <<<DATA
This is a link <a href="https://whosebug.com/">SO</a> and this is <a href="http://test.test">unsubscribe</a> and
another and this is <a href="http://test.test">UnSubScribe</a>.
DATA;
$dom = new DomDocument();
$dom->loadHTML($data);
$xpath = new DOMXPath($dom);
$query = "//a[contains(translate(., 'UNSUBSCRIBE', 'unsubscribe'),'unsubscribe')]";
$anchors = $xpath->query($query);
foreach ($anchors as $a) {
echo sprintf("%s: %s" . PHP_EOL,
$a->nodeValue,
$a->getAttribute("href")
);
}
输出
unsubscribe: http://test.test
UnSubScribe: http://test.test
看到一个PHP demo。
我有一封电子邮件的 HTML 正文。我只需要从中解析取消订阅 link。 因此,如果在 dom 中的任何一点有某种 link,包含单词 Unsubscribe, 我需要 return 那个特定 link 的 URL。 我尝试了不同的正则表达式,但我似乎无法找到取消订阅 URL 或有时根本找不到。
$regexp = "<a\s[^>]*href=(\"??)([^\" >]*?)\1[^>]*>(.*(?:unsubscribe).*)<\/a>";
preg_match_all("/$regexp/iU", $body, $matches);
var_dump($matches);
这不起作用:/
谢谢
我无法仅使用正则表达式快速找到解决您的问题的方法,所以我希望您能接受比正则表达式更多 PHP 的用法。
这是我想出的:
$regexp = '<a\s+(?:[^>]*?\s+)?href=[\'|"]([^"\']*)[\'|"]>(.*?)<\/a>';
preg_match_all("/$regexp/i", $body, $matches);
$urls = $matches[1];
$tagContents = $matches[2];
$unsubscribeUrls = [];
for ($i = 0; $i < count($tagContents); $i++) {
if(!isset($urls[$i]) || !isset($tagContents[$i])){
continue;
}
if(stripos($tagContents[$i], "unsubscribe") !== false){
$unsubscribeUrls[] = $urls[$i];
}
}
var_dump($unsubscribeUrls);
这将首先匹配所有 a
标签并将它们拆分为 URL 和标签内容。然后,使用 PHP,它将检查标签的内容是否包含“取消订阅”。如果是,它将被添加到 $unsubscribeUrls
变量中。此变量应包含您需要的所有 URL。
您可以使用 DOMXpath 并检查锚点是否包含不区分大小写的取消订阅匹配项,并使用 getAttribute 获取 url 以获取 href
的值。
$data = <<<DATA
This is a link <a href="https://whosebug.com/">SO</a> and this is <a href="http://test.test">unsubscribe</a> and
another and this is <a href="http://test.test">UnSubScribe</a>.
DATA;
$dom = new DomDocument();
$dom->loadHTML($data);
$xpath = new DOMXPath($dom);
$query = "//a[contains(translate(., 'UNSUBSCRIBE', 'unsubscribe'),'unsubscribe')]";
$anchors = $xpath->query($query);
foreach ($anchors as $a) {
echo sprintf("%s: %s" . PHP_EOL,
$a->nodeValue,
$a->getAttribute("href")
);
}
输出
unsubscribe: http://test.test
UnSubScribe: http://test.test
看到一个PHP demo。