#regex
Вопрос:
Я использую следующий фрагмент кода и выражение регулярного выражения для добавления тегов «rel=» к определенным партнерским ссылкам. Хотя этот код хорошо работает с текстовыми ссылками, он не работает со ссылками на изображения, которые следуют этому формату: <img src=»» класс=»»… />
Кто-нибудь знает, как обновить регулярное выражение, чтобы оно соответствовало как текстовым, так и графическим ссылкам?
function rewrite_affiliate_links($content) {
// Don't rewrite URLs on shop page
if ( is_page( 87422 ) ) {
return $content;
}
$content = preg_replace_callback(
'/<a[^>]*href=["|']([^"|']*)["|'][^>]*>([^<]*)</a>/i',
function($m) {
$Sponsored_URLS = explode(",","Amazon.com,amzn.to,shareasale.com,hsselite.7eer.net,tkqlhce.com,jdoqocy.com,dpbolvw.net,awltovhc.com,tqlkg.com,lduhtrp.net,anrdoezrs.net,ftjcfx.com,7eer.net,refersion.com,avantlink.com,/go/,www.sunstar.com.ph,www.alliedmarketresearch.com,www.theyucatantimes.com,rubikicks.com,superfoodprofiles.com,amplifi.com,performancelab.com");
$i = 0;
$j = count($Sponsored_URLS);
while ($i < $j) { ;
if ((strpos(strtolower($m[1]), strtolower($Sponsored_URLS[$i])) !== false)) {
$match = "yes";
}
$i ;
}
if ($match == "yes") {
return '<a href="'.$m[1].'" rel="sponsored noopener" target="_blank">'.$m[2].'*</a>';
} else {
if ((strpos(strtolower($m[1]), $_SERVER['HTTP_HOST']) !== false) || (substr($m[1],0,1) == "#")) {
//return '<' . $m[0] . ' href="'.$m[1].'" rel="follow">'.$m[2].'</a>';
return $m[0];
} else {
return '<a href="'.$m[1].'" rel="follow noopener" target="_blank">'.$m[2].'</a>';
}
}
},
$content);
return $content;
}
Спасибо,
Майкл
Ответ №1:
Я бы просто сделал это отдельно, потому что вы «визуализируете» свой тег «а». Может быть так
<?php
function rewrite_affiliate_links($content) {
$sponsoredLinks = [
"Amazon.com",
"amzn.to",
"shareasale.com",
"hsselite.7eer.net",
"tkqlhce.com",
"jdoqocy.com",
"dpbolvw.net",
"awltovhc.com",
"tqlkg.com",
"lduhtrp.net",
"anrdoezrs.net",
"ftjcfx.com",
"7eer.net",
"refersion.com",
"avantlink.com",
"/go/",
"www.sunstar.com.ph",
"www.alliedmarketresearch.com",
"www.theyucatantimes.com",
"rubikicks.com",
"superfoodprofiles.com",
"amplifi.com",
"performancelab.com",
];
$sponsoredLinksPrepared = implode('|', $sponsoredLinks);
$anchorRegex = "/<a.*?href=(?:"|')(.*?(?:{$sponsoredLinksPrepared}).*?)(?:"|').*?>(.*?)</a>/i";
$anchoreReplacement = '<a href="$1" rel="sponsored noopener" target="_blank">$2 *</a>';
$imgRegex = "/<img.*?src=(?:"|')(.*?(?:{$sponsoredLinksPrepared}).*?)(?:"|') (.*?)>/i";
$imgReplacement = '<img src="$1" rel="sponsored noopener" $2>';
$content = preg_replace($anchorRegex, $anchoreReplacement, $content);
$content = preg_replace($imgRegex, $imgReplacement, $content);
return $content;
}
echo rewrite_affiliate_links('<a href="amzn.to/blah" something="something">some</a>');
echo "n";
echo rewrite_affiliate_links('<img src="amzn.to/blah.jpg" width="234px" height="432px">');
echo "n";
echo rewrite_affiliate_links('<a href="amzn.co.com/blah" something="something">some non sponsored</a>');
Это не полный код, это просто общая идея.
Комментарии:
1. Спасибо, я попробую это сделать!
2. Кажется, это отлично работает, большое спасибо!