Visualizzazione dei risultati da 1 a 5 su 5
  1. #1
    Utente di HTML.it
    Registrato dal
    Dec 2008
    Messaggi
    505

    regex - trasformare link senza tag [ur]

    salve,

    ho quasi completato la mia funzione per il bbcode con preg_replace e relative regular expression.

    mi manca ancora da fare questa cosa :

    praticamente i tag per i link che voglio gestire sono di due tipi :

    a - con bbcode url personalizzato :
    #\[ url=(.*?)\](.*?)\[/ url\]#i (senza spazi ovviamente )
    b - link normali senza tag personalizzato; es. se uno scrive html://w w w.qualcosa oppure w w w.qualcosa voglio che me li trasformi in link html. (idem, w w w senza spazi);

    per il punto (a) nessun problema, ho inserito nella $format_replace questo replacement : '$2'
    per quanto riguarda il punto (b), bhè quì è il mio problema.

    ho provato con questi :

    $format_search
    '#((?:ftp|http?)://.*?)#i'
    '#(www\..*?)#i'

    $format_replace
    '$1'
    '$1'

    oltre al fatto di non funzionare per nulla, succede che facendo così (naturalmente) mi fà il replace due volte se inserisco un url nel tag personalizzato (ovviamente xkè anche dopo [ url= ] troverà un ftp/http o un w w w; per non parlare quando metto il tag [ url= ] personalizzato e scrivo [ url ]http://w w w.[ /url ] , in quanto me lo applica tre volte.).

    come posso risolvere?

    saluti, e grazie per l'attenzione

  2. #2
    Utente di HTML.it
    Registrato dal
    Dec 2008
    Messaggi
    505
    uhm, per ora sono arrivato a questa idea...

    supponiamo di lavorare solo su due casi :

    1 - [ url=www.link1.it]link1[ /url ]
    2 - w ww.link2.it

    nel primo posso fare il match grazie alla regex
    '#\[ url=(.*?)\](.*?)\[/url \]#i'

    nel secondo, devo fare in modo di costruirla così
    '#(^\[url=(.*?)\])(w ww\..*?)#i'

    cioè, tutti i link w ww che non contengano [ url=* ].

    a rigor di logica con questa tecnica dovrebbe funzionare, è che non funziona la negazione...

    o, ancora meglio, se imposto i limitatori di inizio e fine stringa, e scrivo :
    '#^(www\.)(.*?)$#i'

    dovrebbe vederla come "quando trovi una stringa che inizia esattamente con w ww.", quindi se prima c'è un [ url ] non dovrebbe funzionare... ma non fà il match nemmeno quì...

  3. #3
    Utente di HTML.it
    Registrato dal
    Dec 2008
    Messaggi
    505
    un'altra soluzione sarebbe da esaminarla prima di mandarla in pasto al bbcode parser. a tal proposito mi son creato una funzioncina :
    codice:
        function checkLinks($string) {
            $arrelab="";
            $arr=explode(' \r\n', $string);
            for($i=0; $i<sizeof($arr); $i++) {
                if ((strpos($arr[$i], 'www.')!==false) or (strpos($arr[$i], 'http://')!==false) or (strpos($arr[$i], 'ftp://')!==false)) {
                    if (strpos($arr[$i], '[url=')===false) {
                        $arr[$i]=''.$arr[$i].'';
                    }
                }
                
                $arrelab=$arrelab." ".$arr[$i];
            }
            return $arrelab;
        }
    
        // row[0] è la stringa da stampare, presa dal DB
        <? $row[0]=checkLinks(htmlspecialchars($row[0])); ?>
        <?=forumBBCode($row[0])?>
    sembra funzionare, tranne per il fatto che fà l'explode solo per un parametro ' ' (lo spazio), e a me servirebbe oltre che allo spazio anche per i ritorni a capo (non sò se esiste un modo con l'explore di impostare più delimitatori);

    questo approccio non sò se sia il migliore, in quanto se ho una stringa memorizzata (supponiamo) in un mediumtext di mysql, fare l'explode su tale stringa è un operarazione esosa... (anche se il preg_replace viene cmq applicato su una stringa di tale dimensione...)

    aspetto qualche vostra illuminazione

  4. #4
    Utente di HTML.it
    Registrato dal
    Dec 2008
    Messaggi
    505
    nessun help?

  5. #5
    Utente di HTML.it
    Registrato dal
    Dec 2008
    Messaggi
    505
    ho risolto impostando (dopo) il tag [ url=] in preg_replace questo :

    codice:
    preg_replace('#(?<![>/"])(((http|https|ftp)://)?www[a-zA-Z0-9\-_\.]+)#im', '$1'
    che ne pensate... valido?

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.