2012-05-26 15 views
8

Symfony1 aveva una funzione di supporto chiamata auto_link_text(), che analizzava un blocco di testo e avvolgeva tutti gli URL di testo nei tag <a>, popolando automaticamente l'attributo href.Twig include un filtro per il testo di auto-collegamento?

Twig include una funzione come questa? Ho cercato su Google e ho analizzato il codice, ma non riesco a trovarne uno. Ovviamente posso codificarne uno anch'io, ma non voglio replicare qualcosa se è già lì.

Se faccio codice uno me stesso, dovrebbe essere una funzione o un filtro?

risposta

14

la funzione non esiste in ramoscello, ma si può anche aggiungere le proprie estensioni a Twig:

class AutoLinkTwigExtension extends \Twig_Extension 
{ 

    public function getFilters() 
    { 
     return array('auto_link_text' => new \Twig_Filter_Method($this, 'auto_link_text', array('is_safe' => array('html'))), 
     ); 
    } 

    public function getName() 
    { 
     return "auto_link_twig_extension"; 
    } 

    static public function auto_link_text($string) 
    { 

     $regexp = "/(<a.*?>)?(https?)?(:\/\/)?(\w+\.)?(\w+)\.(\w+)(<\/a.*?>)?/i"; 
     $anchorMarkup = "<a href=\"%s://%s\" target=\"_blank\" >%s</a>"; 

     preg_match_all($regexp, $string, $matches, \PREG_SET_ORDER); 

     foreach ($matches as $match) { 
      if (empty($match[1]) && empty($match[7])) { 
       $http = $match[2]?$match[2]:'http'; 
       $replace = sprintf($anchorMarkup, $http, $match[0], $match[0]); 
       $string = str_replace($match[0], $replace, $string); 
      } 
     } 

     return $string; 
    } 
} 
+0

Questa soluzione sembra funzionare in modo errato per me se l'URL ha già un prefisso 'http: //'. In tal caso, l'href risultante sarà simile a 'http: // http: // google.com'. Quello che per me è stato risolto è stata la sostituzione del terzo argomento '$ match [0]' in sprintf con '$ match [4]. $ corrisponde [5]. "" . $ Partita [6] '. –

10

Se si utilizza ramoscello all'interno di Symfony2, c'è un pacco per questo: https://github.com/liip/LiipUrlAutoConverterBundle

Se lo si utilizza al di fuori di Symfony2, è possibile inviare un messaggio di pubbliche relazioni per separare il bundle e l'estensione di ramoscello!

+0

Thx, questo è un pacchetto davvero interessante –

Problemi correlati