Visualizzazione risultati 1 fino 16 di 16

Discussione: Replace automatico di una scritta HTTP in link

  1. #1
    Guest

    Predefinito Replace automatico di una scritta HTTP in link

    Ragazzi non so se è la sezione giusta, ma non sapendo in che linguaggio si possa fare ciò ho postato qui.

    Allora vorrei che quando un utente commenta ed inserisce un URL senza inserirlo nel tag
    Codice:
    [ url ][/ url ]
    il sito se ne accorge e automaticamente trasformi un semplice testo
    Codice:
    http://miosito.com....
    in un link cliccabile. E magari se possibile come accade in questo forum, lo abbrevi pure.

    ad esempio

    Lo trasforma in un link cliccabile e se si può accorciato del tipo:

    se non sono stato chiaro vi prego di dirmelo che provo a rispiegarami.

  2. #2
    L'avatar di radiodelmomento
    radiodelmomento non è connesso AlterGuru
    Data registrazione
    09-09-2010
    Messaggi
    1,075

    Predefinito

    Ciao!
    Quello che ti serve è la funzione strstr().
    Per la seconda dovresti vedere se ad esempio un link è più lungo di 30 caratteri, quindi stampare soltanto i primi e gli ultimi 10, utilizzando substr().

  3. #3
    Guest

    Predefinito

    Codice PHP:
    <?php
    $email
    = 'name@example.com';
    $domain = strstr($email, '@');
    echo
    $domain; // prints @example.com

    $user = strstr($email, '@', true); // As of PHP 5.3.0
    echo $user; // prints name
    ?>
    L'esempio della guida non mi è chiaro su come posso riadattare la funzione al mio scopo. cioè sembra quasi un Explode.

    Mettiamo il caso io abbia un commento di questo tipo:

    Codice PHP:
    $commento="Ciao sono un commento d'esempio, http://miosito.com/ciao/pag.php, nel bel mezzo ho un link!";
    Ora il commento avrà variabile $commento, andandola ad inserire all'interno della funzione in questo modo:

    Codice PHP:
    <?php
    $domain
    = strstr($commento, 'http://');
    echo
    $domain;
    ?>
    stamperà:

    Codice:
    miosito.com/ciao/pag.php, nel bel mezzo ho un link!
    e quindi non mi torna in discorso

  4. #4
    L'avatar di radiodelmomento
    radiodelmomento non è connesso AlterGuru
    Data registrazione
    09-09-2010
    Messaggi
    1,075

    Predefinito

    Non avevo pensato che c'era altro testo.
    Comunque dovresti prendere da http:// fino allo spazio, cioè dove termina il link.
    Se ci sono attaccate virgole e/o punti quello è un altro discorso e ci pensiamo dopo.

  5. #5
    Guest

    Predefinito

    Citazione Originalmente inviato da radiodelmomento Visualizza messaggio
    Non avevo pensato che c'era altro testo.
    Comunque dovresti prendere da http:// fino allo spazio, cioè dove termina il link.
    Se ci sono attaccate virgole e/o punti quello è un altro discorso e ci pensiamo dopo.
    ehm, come faccio a dirgli "fino allo spazio" ?

  6. #6
    L'avatar di dreadnaut
    dreadnaut non è connesso Super Moderatore
    Data registrazione
    22-02-2004
    Messaggi
    6,292

    Predefinito

    In effetti non so bene come avrebbe usato strstr(), ma decisamente puoi farlo con preg_replace(). Qualcosa tipo:

    Codice PHP:
    $testo = preg_replace('#(http://(\S*))#', '<a href="\1">\2</a>', $testo);
    Poi puoi raffinare l'espressione regolare a tua preferenza. Se invece vuoi anche accorciare i link, devi passare per preg_replace_callback().
    Ultima modifica di dreadnaut : 14-02-2012 alle ore 15.31.06

  7. #7
    Guest

    Predefinito

    Citazione Originalmente inviato da dreadnaut Visualizza messaggio
    In effetti non so bene come avrebbe usato strstr(), ma decisamente puoi farlo con preg_replace(). Qualcosa tipo:

    Codice PHP:
    $testo = preg_replace('#(http://(\S*))#', '<a href="\1">\2</a>', $testo);
    Poi puoi raffinare l'espressione regolare a tua preferenza. Se invece vuoi anche accorciare i link, devi passare per preg_replace_callback().
    Fantastico! Funziona! =D =D se vuoi provare il codice ecco un link temporaneo:

    http://theothers.altervista.org/test

    ho inserito questo testo:

    prova, ciao sono un testo, ora più il la metterò un link e dopo altro testo...
    http://theothers.altervista.org/test/
    ecco altro testo dopo il link, vediamo che succederà


    e funziona! Solo un problema se alla fine del link, in questo caso "test/" ci si mette una virgola così "test/," la virgola viene inglobata nel link, come si può risolvere?

  8. #8
    L'avatar di dreadnaut
    dreadnaut non è connesso Super Moderatore
    Data registrazione
    22-02-2004
    Messaggi
    6,292

    Predefinito

    Si risolve non mettendo caratteri subito dopo un link
    Ultima modifica di dreadnaut : 14-02-2012 alle ore 16.03.02

  9. #9
    Guest

    Predefinito

    Citazione Originalmente inviato da dreadnaut Visualizza messaggio
    Si risolve non mettendo caratteri subito dopo un link
    troppo facile =D se un utente inserisce un punto o una virgola, anche solo per sbaglio, il link risulta invalido. Possibile che non c'è una soluzione?

    http://theothers.altervista.org/test/,
    http://theothers.altervista.org/test/

    tipo altervista funziona, se inserisco una virgola subito dopo un link la taglia fuori.

  10. #10
    L'avatar di dreadnaut
    dreadnaut non è connesso Super Moderatore
    Data registrazione
    22-02-2004
    Messaggi
    6,292

    Predefinito

    Altrimenti, vai a vedere le asserzioni in regexp, e scrivi qualcosa del genere:

    Codice PHP:
    $testo = preg_replace('#(http://(\S*)(?!,)#', '<a href="\1">\2</a>', $testo);
    Dove (?!,) vuol dire "non seguito da ,".

  11. #11
    Guest

    Predefinito

    Ti sei dimenticato una parentesi tonda prima del # quindi il codice funzionante è questo:

    Codice PHP:
    $testo = preg_replace('#(http://(\S*)(?!,))#', '<a href="\1">\2</a>', $testo);
    premesso ciò, funziona con il doppio apice (") e con il punto (.) ma non con la virgola (,)

  12. #12
    L'avatar di dreadnaut
    dreadnaut non è connesso Super Moderatore
    Data registrazione
    22-02-2004
    Messaggi
    6,292

    Predefinito

    Ah, in effetti è colpa mia: con l'asserzione, se l'espressione trova una virgola la ingloba direttamente

    Ci sono due modi a questo punto: o specifichi quali caratteri accetti nell'url, o quali rifiuti. Entrambi hanno dei problemi, per i dettagli vedi character classes.

    Accetti:
    Codice PHP:
    $testo = preg_replace('#(http://([a-zA-Z0-9/-.]*)#', '<a href="\1">\2</a>', $testo);
    Rifiuti:
    Codice PHP:
    $testo = preg_replace('#(http://([^," )]*)#', '<a href="\1">\2</a>', $testo);
    (il ^ vuol dire "non i caratteri che seguono")

  13. #13
    Guest

    Predefinito

    Fantastico, ho usato il "rifiuta" posto il codice, che c'è un errore di battitura =) la solita parentesi! XD

    Codice PHP:
    $testo = preg_replace('#(http://([^," ])*)#', '<a href="\1">\1</a>', $testo);
    Ti ringrazio molto!

    Conosci qualche guida italiana, valida per imparare i preg_replace?
    Ultima modifica di theothers : 14-02-2012 alle ore 17.19.38

  14. #14
    L'avatar di dreadnaut
    dreadnaut non è connesso Super Moderatore
    Data registrazione
    22-02-2004
    Messaggi
    6,292

    Predefinito

    In italiano non ne ho viste di particolari, quindi http://www.google.it/search?q=php%20...oni%20regolari

  15. #15
    Guest

    Predefinito

    Citazione Originalmente inviato da dreadnaut Visualizza messaggio
    In italiano non ne ho viste di particolari, quindi http://www.google.it/search?q=php%20...oni%20regolari
    Grazie! Mi sei stato molto molto d'aiuto =)

    se voglio trasformare i testi che iniziano per HTTP:// HTTPS:// e WWW. come faccio?

    Ho provato con:

    Codice PHP:
    $testo = preg_replace('#(http://([^,";: ])*)|(https://([^,";: ])*)|(www.([^,";: ])*)#', '<a href="$1">$1</a> <a href="http://$2">$2</a> <a href="$3">$3</a>', $testo);
    Non da errore, ma non mi visualizza i link come vorrei, l'HTTP funziona bene, l'HTTPS si vede solo il testo ma non è cliccabile, e il WWW. non funziona per niente.
    Ultima modifica di theothers : 14-02-2012 alle ore 18.38.52

  16. #16
    L'avatar di dreadnaut
    dreadnaut non è connesso Super Moderatore
    Data registrazione
    22-02-2004
    Messaggi
    6,292

    Predefinito

    Non funziona perché gli \1 \2 ... (o $1 $2 ...) nel secondo parametro fanno riferimento ai gruppi (le parentesi) nell'espressione regolare.

    Puoi però fare così:

    Codice PHP:
    $testo = preg_replace('#((https?://|www\.)([^,";: ])+)#', '<a href="\1\2">\3</a>', $testo);
    Invece di tre casi diversi, uno solo ma con più possibilità: http con una s opzionale (che si scrive s?) oppure www. (il . va protetto, altrimenti vuol dire "qualsiasi carattere").

    Ho anche messo un "+" invece del "*". L'asterisco vuol dire "zero o più di queste cose", il più "almeno una, o più".

Regole di scrittura

  • Non puoi creare nuove discussioni
  • Non puoi rispondere ai messaggi
  • Non puoi inserire allegati.
  • Non puoi modificare i tuoi messaggi
  •