Принимать http, https и www в методе фильтра ООП

Метод ниже делает ссылки кликабельными. Это фильтр. Вы отправляете текстовую строку, и она преобразует http и https в кликабельные ссылки.

/**
* Make clickable links from URLs in text.
*
*/
public function make_clickable($text) {

  return preg_replace_callback(
    '#\b(?<![href|src]=[\'"])https?://[^\s()<>]+(?:\([\w\d]+\)|([^[:punct:]\s]|/))#',
  create_function(
    '$matches',
    'return "<a href=\'{$matches[0]}\'>{$matches[0]}</a>";'
  ),$text);

}

Я хочу расширить этот метод, чтобы он также принимал www (например, www.google.com), возможно ли это?

Заранее спасибо.

ОБНОВЛЕНИЕ

Строка ниже находит http, https и www, но ссылки с типом www имеют неверный href . Например, он ссылается на webroot/www.test.com.

'/((http[s]?:|www[.])[^\s]*)/'

РЕШЕНИЕ

/**
* Make clickable links from URLs in text.
*/
public function make_clickable($text) {

  // Force http to www.
  $text = preg_replace( "(www\.)", "http://www.", $text );

  // Delete duplicates after force.
  $text = preg_replace( "(http://http://www\.)", "http://www.", $text );
  $text = preg_replace( "(https://http://www\.)", "https://www.", $text );

  // The RegEx.
  $regExUrl = "/(http|https)\:\/\/[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3}(\/\S*)?/";

  // Check if there is a URL in the text.
  if(preg_match($regExUrl, $text, $url)) {

    // Make the URLs hyper links.
    $text = preg_replace(
      $regExUrl,
      '<a href="' . $url[0] . '" rel="nofollow" target="_blank">' . $url[0] . '</a>',
      $text
    );

  }    

  return $text;

}

person Treps    schedule 19.11.2014    source источник
comment
Я предполагаю, что вы имеете в виду пройти только www.domain.com?   -  person Demodave    schedule 19.11.2014
comment
Да, прости. Я обновлю вопрос.   -  person Treps    schedule 19.11.2014


Ответы (1)


У вас есть некоторые синтаксические ошибки (не удалось избежать /). В любом случае, если вы хотите сопоставить www., просто добавьте его в свою строку напрямую (не забывая экранировать ., который в противном случае является управляющим символом)

preg_replace_callback(
'#\b(?<![href|src]=[\'"])(?:http(?:s|):\/\/|)(?:www\.|)[^\s()<>]+(?:\([\w\d]+\)|(?:[^[:punct:]\s]|\/))#', ...);
person Machavity♦    schedule 19.11.2014
comment
Вы хотели заставить www.? Вот для чего я это написал - person Machavity♦; 19.11.2014
comment
Я не знаю. Я просто хочу, чтобы он принимал http, https и www в интеграле. Сейчас просто работает http и https. - person Treps; 19.11.2014
comment
Я добавил то, что должно лучше соответствовать тому, что вы просите - person Machavity♦; 19.11.2014
comment
Хм, новый скрипт сделал каждое слово в тексте ссылкой. Текст является неотъемлемой частью, поэтому нам нужно найти http, https или www и просто сделать эту часть ссылкой. - person Treps; 20.11.2014