Регулярное выражение для управления ссылками на изображения

#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. Кажется, это отлично работает, большое спасибо!