Convertir des URLs de texte en HTML hyperliens en PHP

j'ai un système de commentaires simple où les gens peuvent soumettre des hyperliens à l'intérieur du champ de texte en clair. Lorsque j'affiche ces enregistrements de retour de la base de données et dans la page web, quel RegExp en PHP puis-je utiliser pour convertir ces liens en liens ancre de type HTML?

Je ne veux pas que l'algorithme fasse cela avec un autre type de lien, juste http et https.

48
demandé sur random 2009-12-25 07:17:12
la source

13 ответов

Voici une autre solution, cela va capturer tous les http/https / www et convertir en liens cliquables.

$url = '~(?:(https?)://([^\s<]+)|(www\.[^\s<]+?\.[^\s<]+))(?<![\.,:])~i'; 
$string = preg_replace($url, '<a href="" target="_blank" title=""></a>', $string);
echo $string;

alternativement pour simplement attraper http / https puis utiliser le code ci-dessous.

$url = '/(http|https|ftp|ftps)\:\/\/[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3}(\/\S*)?/';   
$string= preg_replace($url, '<a href="" target="_blank" title=""></a>', $string);
echo $string;

modifier: Le script ci-dessous attrapera tous les types d'url et les convertira en liens cliquables.

$url = '@(http)?(s)?(://)?(([a-zA-Z])([-\w]+\.)+([^\s\.]+[^\s]*)+[^,.\s])@';
$string = preg_replace($url, '<a href="http://" target="_blank" title=""></a>', $string);
echo $string;

nouvelle mise à jour, si vous avez le string strip le (s) puis utilisez le bloc de code ci-dessous, merci à @AndrewEllis pour pointer ceci hors.

$url = '@(http(s)?)?(://)?(([a-zA-Z])([-\w]+\.)+([^\s\.]+[^\s]*)+[^,.\s])@';
$string = preg_replace($url, '<a href="http://" target="_blank" title=""></a>', $string);
echo $string;

Voici une solution très simple pour l'URL qui ne s'affiche pas correctement.

$email = '<a href="mailto:[email protected]">[email protected]</a>';
$string = $email;
echo $string;

c'est une solution très simple mais vous devrez la modifier pour votre propre usage.

38
répondu Ruddernation Designs 2018-04-12 22:15:36
la source

Eh bien, la réponse de Volomike est beaucoup plus proche. Et pour pousser un peu plus loin, voici ce que j'ai fait pour elle d'ignorer la fuite période à la fin de l'hyperliens. J'ai aussi considéré des fragments D'URI.

public static function makeClickableLinks($s) {
  return preg_replace('@(https?://([-\w\.]+[-\w])+(:\d+)?(/([\w/_\.#-]*(\?\S+)?[^\.\s])?)?)@', '<a href="" target="_blank"></a>', $s);
}
37
répondu MkVal 2010-08-25 09:37:21
la source
<?
function makeClickableLinks($text)
{

        $text = html_entity_decode($text);
        $text = " ".$text;
        $text = eregi_replace('(((f|ht){1}tp://)[[email protected]:%_\+.~#?&//=]+)',
                '<a href="\1" target=_blank>\1</a>', $text);
        $text = eregi_replace('(((f|ht){1}tps://)[[email protected]:%_\+.~#?&//=]+)',
                '<a href="\1" target=_blank>\1</a>', $text);
        $text = eregi_replace('([[:space:]()[{}])(www.[[email protected]:%_\+.~#?&//=]+)',
        '\1<a href="http://\2" target=_blank>\2</a>', $text);
        $text = eregi_replace('([_\.0-9a-z-][email protected]([0-9a-z][0-9a-z-]+\.)+[a-z]{2,3})',
        '<a href="mailto:\1" target=_blank>\1</a>', $text);
        return $text;
}

// Example Usage
echo makeClickableLinks("This is a test clickable link: http://www.websewak.com  You can also try using an email address like [email protected]");
?>
8
répondu Luca Matteis 2009-12-25 07:21:16
la source

Consulter http://zenverse.net/php-function-to-auto-convert-url-into-hyperlink/. C'est ainsi que wordpress le résoud

function _make_url_clickable_cb($matches) {
    $ret = '';
    $url = $matches[2];

    if ( empty($url) )
        return $matches[0];
    // removed trailing [.,;:] from URL
    if ( in_array(substr($url, -1), array('.', ',', ';', ':')) === true ) {
        $ret = substr($url, -1);
        $url = substr($url, 0, strlen($url)-1);
    }
    return $matches[1] . "<a href=\"$url\" rel=\"nofollow\">$url</a>" . $ret;
}

function _make_web_ftp_clickable_cb($matches) {
    $ret = '';
    $dest = $matches[2];
    $dest = 'http://' . $dest;

    if ( empty($dest) )
        return $matches[0];
    // removed trailing [,;:] from URL
    if ( in_array(substr($dest, -1), array('.', ',', ';', ':')) === true ) {
        $ret = substr($dest, -1);
        $dest = substr($dest, 0, strlen($dest)-1);
    }
    return $matches[1] . "<a href=\"$dest\" rel=\"nofollow\">$dest</a>" . $ret;
}

function _make_email_clickable_cb($matches) {
    $email = $matches[2] . '@' . $matches[3];
    return $matches[1] . "<a href=\"mailto:$email\">$email</a>";
}

function make_clickable($ret) {
    $ret = ' ' . $ret;
    // in testing, using arrays here was found to be faster
    $ret = preg_replace_callback('#([\s>])([\w]+?://[\w\x80-\xff\#$%&~/.\-;:=,[email protected]\[\]+]*)#is', '_make_url_clickable_cb', $ret);
    $ret = preg_replace_callback('#([\s>])((www|ftp)\.[\w\x80-\xff\#$%&~/.\-;:=,[email protected]\[\]+]*)#is', '_make_web_ftp_clickable_cb', $ret);
    $ret = preg_replace_callback('#([\s>])([.0-9a-z_+-]+)@(([0-9a-z-]+\.)+[0-9a-z]{2,})#i', '_make_email_clickable_cb', $ret);

    // this one is not in an array because we need it to run last, for cleanup of accidental links within links
    $ret = preg_replace("#(<a( [^>]+?>|>))<a [^>]+?>([^>]+?)</a></a>#i", "</a>", $ret);
    $ret = trim($ret);
    return $ret;
}
7
répondu Ashok Pundit 2014-09-16 09:59:11
la source

Les plus notés réponse ne pas faire le travail pour moi, le lien suivant n'a pas été remplacé correctement:

http://www.fifa.com/worldcup/matches/round255951/match=300186487/index.html#nosticky

après quelques recherches sur google et quelques tests, voici ce que j'ai trouvé:

public static function replaceLinks($s) {
    return preg_replace('@(https?://([-\w\.]+)+(:\d+)?(/([\w/_\.%-=#]*(\?\S+)?)?)?)@', '<a href=""></a>', $s);
}

Je ne suis pas un expert en regex, en fait il me confond assez:)

Donc n'hésitez pas à commenter et à améliorer cette solution.

5
répondu Stephan Wagner 2015-01-30 01:13:55
la source
public static function makeClickableLinks($s) {
    return preg_replace('@(https?://([-\w\.]+)+(:\d+)?(/([\w/_\.-]*(\?\S+)?)?)?)@', '<a href=""></a>', $s);
}
2
répondu Volomike 2009-12-25 07:53:03
la source

Voici mon code pour formater tous les liens dans le texte, y compris les e-mails, urls avec et sans protocole.

public function formatLinksInText($text)
{
    //Catch all links with protocol      
    $reg = '/(http|https|ftp|ftps)\:\/\/[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,}(\/\S*)?/'; 
    $formatText = preg_replace($reg, '<a href="" style="font-weight: normal;" target="_blank" title=""></a>', $formatText);

    //Catch all links without protocol
    $reg2 = '/(?<=\s|\A)([0-9a-zA-Z\-\.]+\.[a-zA-Z0-9\/]{2,})(?=\s|$|\,|\.)/';
    $formatText = preg_replace($reg2, '<a href="//" style="font-weight: normal;" target="_blank" title=""></a>', $formatText);

    //Catch all emails
    $emailRegex = '/(\S+\@\S+\.\S+)/';
    $formatText = preg_replace($emailRegex, '<a href="mailto:" style="font-weight: normal;" target="_blank" title=""></a>', $formatText);
    $formatText = nl2br($formatText);
    return $formatText;
}

s'il vous Plaît commentaire l'url qui ne fonctionne pas. Je vais essayer de mettre à jour le regex.

2
répondu Hoang Trung 2018-04-06 13:46:56
la source

je recommande de ne pas faire beaucoup de choses à la volée comme ça. Je préfère utiliser une interface d'édition simple comme celle utilisée dans stackoverflow. Il est appelé Markdown.

1
répondu Yousf 2009-12-25 07:50:57
la source

la réponse de MkVal fonctionne mais dans le cas où nous avons déjà le lien d'ancrage, il rendra le texte dans un format étrange.

Voici la solution qui fonctionne pour moi dans les deux cas:

$s = preg_replace ( 
    "/(?<!a href=\")(?<!src=\")((http|ftp)+(s)?:\/\/[^<>\s]+)/i",
    "<a href=\"\0\" target=\"blank\">\0</a>",
    $s
);
1
répondu Thong Tran 2014-02-07 18:15:24
la source

j'utilise une fonction qui provient de question2answer, il accepte le texte simple et même les liens de texte simple en html:

// $html holds the string
$htmlunlinkeds = array_reverse(preg_split('|<[Aa]\s+[^>]+>.*</[Aa]\s*>|', $html, -1, PREG_SPLIT_OFFSET_CAPTURE)); // start from end so we substitute correctly
foreach ($htmlunlinkeds as $htmlunlinked)
{ // and that we don't detect links inside HTML, e.g. <img src="http://...">
    $thishtmluntaggeds = array_reverse(preg_split('/<[^>]*>/', $htmlunlinked[0], -1, PREG_SPLIT_OFFSET_CAPTURE)); // again, start from end
    foreach ($thishtmluntaggeds as $thishtmluntagged)
    {
        $innerhtml = $thishtmluntagged[0];
        if(is_numeric(strpos($innerhtml, '://'))) 
        { // quick test first
            $newhtml = qa_html_convert_urls($innerhtml, qa_opt('links_in_new_window'));
            $html = substr_replace($html, $newhtml, $htmlunlinked[1]+$thishtmluntagged[1], strlen($innerhtml));
        }
    }
}   
echo $html;

function qa_html_convert_urls($html, $newwindow = false)
/*
    Return $html with any URLs converted into links (with nofollow and in a new window if $newwindow).
    Closing parentheses/brackets are removed from the link if they don't have a matching opening one. This avoids creating
    incorrect URLs from (http://www.question2answer.org) but allow URLs such as http://www.wikipedia.org/Computers_(Software)
*/
{
    $uc = 'a-z\x{00a1}-\x{ffff}';
    $url_regex = '#\b((?:https?|ftp)://(?:[0-9'.$uc.'][0-9'.$uc.'-]*\.)+['.$uc.']{2,}(?::\d{2,5})?(?:/(?:[^\s<>]*[^\s<>\.])?)?)#iu';

    // get matches and their positions
    if (preg_match_all($url_regex, $html, $matches, PREG_OFFSET_CAPTURE)) {
        $brackets = array(
            ')' => '(',
            '}' => '{',
            ']' => '[',
        );

        // loop backwards so we substitute correctly
        for ($i = count($matches[1])-1; $i >= 0; $i--) {
            $match = $matches[1][$i];
            $text_url = $match[0];
            $removed = '';
            $lastch = substr($text_url, -1);

            // exclude bracket from link if no matching bracket
            while (array_key_exists($lastch, $brackets)) {
                $open_char = $brackets[$lastch];
                $num_open = substr_count($text_url, $open_char);
                $num_close = substr_count($text_url, $lastch);

                if ($num_close == $num_open + 1) {
                    $text_url = substr($text_url, 0, -1);
                    $removed = $lastch . $removed;
                    $lastch = substr($text_url, -1);
                }
                else
                    break;
            }

            $target = $newwindow ? ' target="_blank"' : '';
            $replace = '<a href="' . $text_url . '" rel="nofollow"' . $target . '>' . $text_url . '</a>' . $removed;
            $html = substr_replace($html, $replace, $match[1], strlen($match[0]));
        }
    }

    return $html;
}

un peu de code en raison de l'acceptation des liens qui contiennent des parenthèses et d'autres caractères, mais probablement cela aide.

1
répondu Kai Noack 2016-01-29 14:13:09
la source

Essayez celui-ci:

$s = preg_replace('/(?<!href="|">)(?<!src=\")((http|ftp)+(s)?:\/\/[^<>\s]+)/is', '<a href="\1" target="_blank">\1</a>', $s);

il saute les liens existants (si nous avons déjà un href, il n'ajoutera pas de href à l'intérieur d'un href). Sinon, il ajoutera l'a href avec la cible vide.

0
répondu Pascut 2017-11-13 18:53:53
la source
$string = 'example.com
www.example.com
http://example.com
https://example.com
http://www.example.com
https://www.example.com';

preg_match_all('#(\w*://|www\.)[a-z0-9]+(-+[a-z0-9]+)*(\.[a-z0-9]+(-+[a-z0-9]+)*)+(/([^\s()<>;]+\w)?/?)?#i', $string, $matches, PREG_OFFSET_CAPTURE | PREG_SET_ORDER);
foreach (array_reverse($matches) as $match) {
  $a = '<a href="'.(strpos($match[1][0], '/') ? '' : 'http://') . $match[0][0].'">' . $match[0][0] . '</a>';
  $string = substr_replace($string, $a, $match[0][1], strlen($match[0][0]));
}

echo $string;

Résultat:

example.com
<a href="http://www.example.com">www.example.com</a>
<a href="http://example.com">http://example.com</a>
<a href="https://example.com">https://example.com</a>
<a href="http://www.example.com">http://www.example.com</a>
<a href="https://www.example.com">https://www.example.com</a>

Ce que j'aime dans cette solution, c'est qu'il convertit également www.example.comhttp://www.example.com parce que <a href="www.example.com"></a> ne fonctionne pas (sans http/https le protocole indique yourdomain.com/www.example.com).

0
répondu max 2018-04-16 17:23:06
la source

si j'ai raison, ce que vous voulez faire, c'est transformer du texte ordinaire en liens http. Voici ce que je pense pouvoir aider:

<?php

   $list = mysqli_query($con,"SELECT * FROM list WHERE name = 'table content'"); 
   while($row2 = mysqli_fetch_array($list)) {
echo "<a target='_blank' href='http://www." . $row2['content']. "'>" . $row2['content']. "</a>";

   }  
?>
-2
répondu Tunaki 2016-05-24 14:01:16
la source

Autres questions sur php regex hyperlink preg-replace