Skapa klickbara länkar från en text make_clickable()

  • Författare
  • Meddelande
Användarvisningsbild

mos

dbwebb

  • Inlägg: 11199
  • Blev medlem: 10 nov 2011, 09:52
  • Ort: Ronneby / Bankeryd

Skapa klickbara länkar från en text make_clickable()

Inlägg23 mar 2012, 15:16

Jag hade en text med vanliga länkar i, jag vill göra om dem till klickbara länkar.

En text:

Kod: Markera allt
Jag har en hemsida på http://dbwebb.se/.


skall formateras till:

Kod: Markera allt
Jag har en hemsida på <a href='http://dbwebb.se/'>http://dbwebb.se/</a>.


Följande kod löste det för mig. Den använder anonyma funktioner som fungerar från PHP5.3 och framåt. Men det går skriva om koden så callbacken funkar med en vanlig funktion.

Kod: Markera allt
<?php
/**
* Make clickable links from URLs in text.
*/
function make_clickable($text) {
  return preg_replace_callback(
    '#\bhttps?://[^\s()<>]+(?:\([\w\d]+\)|([^[:punct:]\s]|/))#',
    create_function(
      '$matches',
      'return "<a href=\'{$matches[0]}\'>{$matches[0]}</a>";'
    ),
    $text
  );
}
...
..:
.... /mos
Användarvisningsbild

dun

php-programmerare

  • Inlägg: 48
  • Blev medlem: 10 nov 2011, 11:13

Re: Skapa klickbara länkar från en text make_clickable()

Inlägg08 maj 2012, 07:46

Hade det inte varit trevligt om den parsar sidor utan http:// också? jag skriver nog hellre dun.se än http://dun.se.
Användarvisningsbild

mos

dbwebb

  • Inlägg: 11199
  • Blev medlem: 10 nov 2011, 09:52
  • Ort: Ronneby / Bankeryd

Re: Skapa klickbara länkar från en text make_clickable()

Inlägg08 maj 2012, 17:28

Mmm, borde ju gå att göra ett sånt regexp ja. Just nu är jag mest missnöjd med att den inte fungerar tillsammans med HTML och <a>-element. Om man redan har länkar i texten som är skrivna som <a href='http://min.webb.se'>Min webbplats</a> så blir det dubbla länkar... Skulle vilja ha regexpet så att det ignorerade allt som redan var inom <a>-elementet. En kurs i regexp vore bra, som någon student sa till mig... :roll:
...
..:
.... /mos

sharpless

regexp-master

  • Inlägg: 130
  • Blev medlem: 10 nov 2011, 14:35

Re: Skapa klickbara länkar från en text make_clickable()

Inlägg08 maj 2012, 19:13

Fulhack?

Kod: Markera allt
#\b(?<!href=['"])https?://[^\s()<>]+(?:\([\w\d]+\)|([^[:punct:]\s]|/))#
Användarvisningsbild

mos

dbwebb

  • Inlägg: 11199
  • Blev medlem: 10 nov 2011, 09:52
  • Ort: Ronneby / Bankeryd

Re: Skapa klickbara länkar från en text make_clickable()

Inlägg11 jun 2012, 08:35

sharpless skrev:Fulhack?

Kod: Markera allt
#\b(?<!href=['"])https?://[^\s()<>]+(?:\([\w\d]+\)|([^[:punct:]\s]|/))#


Hmm, funkade faktiskt, har bara snabbtestat det lite. Regexp är lite magiskt.
...
..:
.... /mos
Användarvisningsbild

mos

dbwebb

  • Inlägg: 11199
  • Blev medlem: 10 nov 2011, 09:52
  • Ort: Ronneby / Bankeryd

Re: Skapa klickbara länkar från en text make_clickable()

Inlägg15 jun 2012, 13:09

sharpless skrev:Fulhack?

Kod: Markera allt
#\b(?<!href=['"])https?://[^\s()<>]+(?:\([\w\d]+\)|([^[:punct:]\s]|/))#


Modifierade lite så att det funkade med <iframe src=>

Kod: Markera allt
'#\b(?<![href|src]=[\'"])https?://[^\s()<>]+(?:\([\w\d]+\)|([^[:punct:]\s]|/))#'
...
..:
.... /mos
Användarvisningsbild

mos

dbwebb

  • Inlägg: 11199
  • Blev medlem: 10 nov 2011, 09:52
  • Ort: Ronneby / Bankeryd

Re: Skapa klickbara länkar från en text make_clickable()

Inlägg13 sep 2012, 14:48

Ok, så här ser senaste versionen ut:
Kod: Markera allt
  /**
   * Make clickable links from URLs in text.
   *
   * @param string text text to be converted.
   * @returns string the formatted text.
   */
  public static function MakeClickable($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
    );
  }

Funkar bra men det tar inte länkar med #fragment. Någon som kan modifiera regexpet till att även fånga länk-kandidater som har #fragment?
...
..:
.... /mos
Användarvisningsbild

Johan

sql-kodare

  • Inlägg: 50
  • Blev medlem: 10 nov 2011, 12:10

Re: Skapa klickbara länkar från en text make_clickable()

Inlägg19 sep 2012, 22:56

Utdrag från "monolog" mellan mig och mos :D

19/09,22:45:27 < johan> mos: kollade ditt regex... vad jag kan se funkar den med ankarlänkar
19/09,22:45:32 < johan> (#something)
19/09,22:45:55 < johan> men jag gjorde en iaf:
Kod: Markera allt
(?<!href="|href=)(https?://)([\w\-]+\.)?([\w\-]+\.\w+)[^,^\.^\s]*

19/09,22:46:09 < johan> jämförde dem (regex:en) på ett antal varierande länkar och de mynnade ut i samma resultat
19/09,22:47:00 < johan> förutom redan existerande länkar i följande format <a href=http://stuff.se>stuff</a> (dvs href="URL" men utan "" alltså bara href=URL)
19/09,22:47:32 < johan> och om man känner för att leva lite on the edge så kan man sätta ett frågetecken efter (https?://)
19/09,22:47:42 < johan> så det blir
Kod: Markera allt
(?<!href="|href=)(https?://)?([\w\-]+\.)?([\w\-]+\.\w+)[^,^\.^\s]*

19/09,22:47:52 < johan> då tar den även länkar utan http[s]://
19/09,22:48:28 < johan> men då tar den ju även existerande länkar i <a href eftersom lookbehind på href=" inte gäller längre (eftersom den lookbehind var associerad med (https?://) )
19/09,22:48:43 < johan> samt att den tar allt.vadsomhelst
19/09,22:48:48 < johan> så t.ex. domain.local matchas (t.ex hade också matchat)
19/09,22:48:59 < johan> även tal som t.ex 152.34
19/09,22:49:04 < johan> avvägning som gäller

alsi12

php-guru

  • Inlägg: 91
  • Blev medlem: 03 sep 2012, 16:02

Re: Skapa klickbara länkar från en text make_clickable()

Inlägg19 sep 2012, 23:15

dun skrev:Hade det inte varit trevligt om den parsar sidor utan http:// också? jag skriver nog hellre dun.se än http://dun.se.


Frågan är ju då hur smart man vill att det ska vara. Säg att du har en lång text, minst två A4-sidor, så kanske en person råkat skriva fel på något ställe och då vill man ju inte att det ska bli en länk till någonting som inte är en riktig länk. Exempelvis "Det var en gång tre fiskar.de simmade runt i sjön." så kan ju "fiskar.de" omvandlas till en länk.

Men så länge man kontrollerar efteråt så lär ju inte detta vara något problem.
Användarvisningsbild

mos

dbwebb

  • Inlägg: 11199
  • Blev medlem: 10 nov 2011, 09:52
  • Ort: Ronneby / Bankeryd

Re: Skapa klickbara länkar från en text make_clickable()

Inlägg29 apr 2013, 15:58

Jag gjorde ett exempel där man ser funktionen make_clickable() i användning. Tänkte jag behövde ett testfall för att se vad som funkar och inte. Jag har i och för sig använt funkionen i Lydia och dbwebb.se ett bra tag nu så den verkar fungera som den ska.

En not bara, det är ett väldigt smidigt sätt att göra länkar automatiskt klickbara, men vill man ha text som passar för en sökmotor så bör man handskapa sina länkar. Det finns inga genvägar där. Jag märker själv att jag har slutat använda make_clickable() och vill numer alltid handkoda mina länkar, största anledningen är sökmotoroptimering av interna länkar.

Den senaste versionen som jag använder ser ut så här:

Kod: Markera allt
/**
* Make clickable links from URLs in text.
*
* @param string $text the text that should be formatted.
*/
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
  );
}
...
..:
.... /mos
Användarvisningsbild

mos

dbwebb

  • Inlägg: 11199
  • Blev medlem: 10 nov 2011, 09:52
  • Ort: Ronneby / Bankeryd

Re: Skapa klickbara länkar från en text make_clickable()

Inlägg30 apr 2018, 17:31

Artikeln i Tips från Coachen "Låt PHP-funktion make_clickable() automatiskt skapa klickbara länkar" fick en uppdatering och en mindre omskrivning av koden.

Koden ser nu ut så här (anonym funktion ersatte create_function()).
Kod: Markera allt
/**
* Make clickable links from URLs in text.
*
* @param string $text the text that should be formatted.
*
* @return string the formatted text.
*/
function makeClickable($text) {
    return preg_replace_callback(
        '#\b(?<![href|src]=[\'"])https?://[^\s()<>]+(?:\([\w\d]+\)|([^[:punct:]\s]|/))#',
        function ($matches) {
            return "<a href=\'{$matches[0]}\'>{$matches[0]}</a>";
        },
        $text
    );
}
...
..:
.... /mos
Användarvisningsbild

mos

dbwebb

  • Inlägg: 11199
  • Blev medlem: 10 nov 2011, 09:52
  • Ort: Ronneby / Bankeryd

Re: Skapa klickbara länkar från en text make_clickable()

Inlägg15 okt 2018, 17:04

Det fanns nog ett fel i koden ovan, som Edward påpekat, en baskslash för mycket i return-satsen (eller en enkelfnutt som skulle varit en dubbelfnutt). Här är den lagade koden:
Kod: Markera allt
/**
* Make clickable links from URLs in text.
*
* @param string $text the text that should be formatted.
*
* @return string the formatted text.
*/
function makeClickable($text) {
    return preg_replace_callback(
        '#\b(?<![href|src]=[\'"])https?://[^\s()<>]+(?:\([\w\d]+\)|([^[:punct:]\s]|/))#',
        function ($matches) {
            return "<a href=\"{$matches[0]}\">{$matches[0]}</a>";
        },
        $text
    );
}
...
..:
.... /mos

Vilka är online

Användare som besöker denna kategori: Bing [Bot] och 16 gäster