Шаблон регулярного выражения для соответствия только ссылкам без www

Я пытаюсь искать только ссылки без www лайк http://google.com, ИЛИ ЖЕ https://facebook.comи т. д. Тогда я хочу добавить www по той же ссылке, так становится http://www.google.com, ИЛИ ЖЕ https://www.facebook.com, так далее.

Тем не менее, у меня есть проблема в моем шаблоне (шаблон, который я использовал для получения всех ссылок с или без www).

$text = '<a href="http://google.com">google</a> bla bla bla <a href="https://www.google.com">google</a>';
preg_match_all("/<a\s[^>]*href=(\"??)([^\" >]*?)\\1[^>]*>(.*)<\/a>/siU", $text, $matches);
foreach ($matches[2] as $old_url) 
{
$text = str_replace("$old_url","$new_url",$text);
}

2 ответа

Решение

Вот пример кода с <a\\s[^>]*href=([\"']?)(?>https?|ftps?):\/\/(?![^'\">]*www[^\"]+?\\1)([^'\">]+?)\\1[^>]*>(.*?)<\\/a> регулярное выражение, чтобы соответствовать только те URL-адреса в атрибутах href, которые не имеют www в них.

Пример кода:

$re = "/<a\\s[^>]*href=([\"']?)(?>https?|ftps?):\/\/(?![^'\">]*www[^\"]+?\\1)([^'\">]+?)\\1[^>]*>(.*?)<\\/a>/"; 
$str = "<a href=\"http://google.com\">google</a> bla bla bla <a href=\"https://www.google.com\">google</a> bla bla bla <a href=\"http://facebook.com\">facebook</a>\n"; 
print ($str . "\n");
$str = preg_replace_callback(
    $re,
    function ($matches) {
        return str_replace($matches[2], "www." . $matches[2], $matches[0]);
  },
  $str
);
print ($str);

Выход:

<a href="http://www.google.com">google</a> bla bla bla <a href="https://www.google.com">google</a> bla bla bla <a href="http://www.facebook.com">facebook</a>

Я бы подумал об использовании DOM и XPath, чтобы позаботиться об этом за вас.

$doc = new DOMDocument;
@$doc->loadHTML($html);

$xpath = new DOMXPath($doc);
$links = $xpath->query('//a[not(contains(@href, "www."))]/@href');

foreach ($links as $link) {
   // process yours urls by $link->nodeValue
   ...
   ...
 }

Вы могли бы тогда использовать parse_url() заменить при обработке URL.

Другие вопросы по тегам