URL preg_replace PHP без http, https или www

Я не очень хорошо разбираюсь в регулярных выражениях и прочем. Я знаю, как превратить http://google.com и www.google.com в ссылки. Однако я хочу, чтобы мой скрипт получал ссылки на следующие строки:

Hello. Have you visited [link goes here]google.com[/link goes here] today?
Hello. Have you visited [link goes here]www.google.com[/link goes here] today?
Hello. Have you visited [link goes here]http://google.com[/link goes here] today?
Hello. Have you visited [link goes here]https://google.com[/link goes here] today?

Конечно, мне бы очень хотелось, чтобы выражение допускало как можно больше символов. Но для того, чтобы первая ссылка работала, я могу придумать только одно объяснение (я не хочу, чтобы люди начали писать text.text, и он станет ссылкой):

<?php
$tlds = array("com", "net", "org", "info", "no", "dk", "se");
foreach($tlds as $tld){
$string = preg_replace("something", "something", $string);
}
?>

Кто-нибудь из вас знает, что делать? :П

Я хочу, чтобы он был похож на Autolinker.js, только в PHP: https://github.com/gregjacobs/Autolinker.js


person Teskon    schedule 19.04.2014    source источник
comment
Попробуйте поискать в Google в будущем... css- ricks.com/snippets/php/find-urls-in-text-make-links   -  person Bryan    schedule 20.04.2014
comment
Прежде чем предлагать мне использовать Google: прочтите, что я прошу. Я хочу, чтобы google.com превратился в гиперссылку, даже если http://, https:// или www. НЕ вводится. Я знаю, как написать код для создания ссылок С протоколами, однако я хочу также превратить ссылки без протокола в ссылки.   -  person Teskon    schedule 20.04.2014


Ответы (2)


Я только что просмотрел предыдущие вопросы в поисках полуприличного регулярного выражения для сопоставления доменов и немного подправил его - возможно, есть и лучше, если вы продолжите поиски.

<?php

$test = 'Hello. Have you visited google.com today?
Hello. Have you visited www.google.com today?
Hello. Have you visited http://google.com today?
Hello. Have you visited https://google.com today?';

$func = function ($match) {

    $text   = trim($match[0]);
    $pieces = parse_url($text);
    $scheme = array_key_exists('scheme', $pieces) ? $pieces['scheme'] : 'http';
    $host   = isset($pieces['host']) ? $pieces['host'] : $pieces['path'];
    $link   = sprintf('%s://%s', $scheme, $host);

    return sprintf('<a href="%s">%s</a>', $link, $text);
};

echo preg_replace_callback('/((http[s]?:\/\/)?(?>[a-z\-0-9]{2,}\.){1,}[a-z]{2,8})(?:\s|\/)/m', $func, $test);

Выход для меня выглядит следующим образом:

Hello. Have you visited <a href="http://google.com">google.com</a>today?
Hello. Have you visited <a href="http://www.google.com">www.google.com</a>today?
Hello. Have you visited <a href="http://google.com">http://google.com</a>today?
Hello. Have you visited <a href="https://google.com">https://google.com</a>today?

Я надеюсь, что это было то, что вы были после.

(Я не хочу, чтобы люди начали писать text.text и он стал ссылкой)

Согласитесь, это будет раздражать :-) - вам, вероятно, следует протестировать этот метод, как только вы остановились на своем решении. Используйте PHPUnit для написания теста и определите для него массив тестовых данных с помощью поставщик данных - это' ll даст вам уверенность в том, что ваше решение правильное.

person jonnu    schedule 20.04.2014

$template = <<< EOF
Hello. Have you visited google.com today?
Hello. Have you visited www.google.com today?
Hello. Have you visited http://google.com today?
Hello. Have you visited https://google.com today?
EOF;

$template = preg_replace_callback('/(?=(([\w\/\/:.]+)\.(?:com|net|org|info|no|dk|se)))\b(?:(?:https?|ftp|file):\/\/|(?:www\.|ftp\.)?)
      (?:\([-A-Z0-9+&@#\/%=~_|$?!:,.]*\)|[-A-Z0-9+&@#\/%=~_|$?!:,.])*
      (?:\([-A-Z0-9+&@#\/%=~_|$?!:,.]*\)|[A-Z0-9+&@#\/%=~_|$])/ix','my_callback',$template);

function my_callback($matches) {

 //check it the link has the protocol if not adds it.
if (preg_match('/https?/ix', $matches[1])) {
    $link = $matches[1];
    return "<a href=\"$link\">$link</a>";
} else {
    $link = $matches[1];
    return "<a href=\"http://$link\">http://$link</a>";
}
}

echo $template;

http://ideone.com/D1E5EK

person Pedro Lobito    schedule 20.04.2014