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

Не съм толкова добър с regex и други неща. Знам как да променя 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);
}
?>

Някой от вас знае ли какво да прави? :P

Искам да е подобен на Autolinker.js, само в PHP: https://github.com/gregjacobs/Autolinker.js


person Teskon    schedule 19.04.2014    source източник
comment
Моля, опитайте да търсите в Google в бъдеще... css- tricks.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="/bg%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, за да напишете тест, и дефинирайте масив от тестови данни за него, като използвате доставчик на данни - това е ще ви даде увереност, че вашето решение е добро.

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