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

    espressioni regolari & preg_replace : delucidazione

    salve,

    ho iniziato ultimamente ad utilizzare le espressioni regolari perchè devo costruirmi (tramite preg_replace) una funzioncina che mi faccia il parser del BBCode.

    in internet già se ne trovano parecchie, però (per i miei scopi) vorrei capire abbastanza a fondo il funzionamento.

    prendiamo questa funzione :
    codice:
    function forumBBCode($str){
       $format_search =  array(
          '#\[b\](.*?)\[/b\]#is', 
          '#\[size=([1-9]|1[0-9]|20)\](.*?)\[/size\]#is',
          '#\[color=\#?([A-F0-9]{3}|[A-F0-9]{6})\](.*?)\[/color\]#is', 
          '#\[url=((?:ftp|https?)://.*?)\](.*?)\[/url\]#i'
       );
    
       $format_replace = array(
          '$1',
          '<span style="font-size: $1px;">$2</span>',
          '<span style="color: #$1;">$2</span>',
          '$2',
       );
    
       $str = preg_replace($format_search, $format_replace, $str);
       $str = nl2br($str);
       return $str;
    }
    vorrei capire bene questo :
    1 - #, #is e #i a cosa servono? ho cercato in giro, ma non le trovo come "espressioni regolari".
    2 - perchè ad esempio davanti a ftp|https? c'è ?: ?
    3 - $1 e $2 da quanto ho capito sono variabile utilizzate da preg_replace che servono a dare l'ordine di sostituzione; in questa funzione, per esempio nello span, troverà due valori per uno stesso elemento nell'array, e li sostituirà in ordine, giusto?
    4 - per esempio nella prima riga, quando troverà la corrispondenza per #\[b\](.*?)\[/b\]#is, inserirà il contenuto di dei b dentro : ma come fà a capire da dove inizia il contenuto? semplicemente tramite le parentesi di (.*?)

    saluti, e grazie per l'interessamento!

  2. #2
    1) # è interpretato come delimitatore dell'espressione regolare.
    Ecco alcuni dei simboli che che puoi usare come delimitatore:
    /
    @
    #
    `
    ~
    %
    &
    '
    "
    (ce ne sono anche altri, ma non ricordo l'elenco completo).

    Poi ci sono tutta una serie di opzioni da mettere dopo il delimitatore di chiusura e in genere si chiamano "modificatori":
    "i" significa che l'espressione sarà "case insensitive" (non c'è differenza tra maiuscole e minuscole)
    "s" significa che la tua stringa può includere anche dei "newline" (cioè in qualche punto vai "a capo")

    2) ?: indica che quello che segue è una sorta di "subpattern". Un'espressione regolare all'interno dell'espressione regolare.

    3) Esatto.

    4) Quello che nell'espressione regolare è nelle parentesi tonde verrà interpretato come variabile.
    Michele
    King Of The Kill

  3. #3
    Utente di HTML.it
    Registrato dal
    Dec 2008
    Messaggi
    505
    chiaro continuo a smanettarci sopra!!! molto interessante come cosa questa delle espressioni regolari! grazie per la chiara e rapida risposta! se trovo qualche difficoltà magari risollevo il topic.

    saluti

  4. #4
    Prego!
    Ciao!
    Michele
    King Of The Kill

  5. #5
    Utente di HTML.it
    Registrato dal
    Dec 2008
    Messaggi
    505
    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 :
    #\[u r l=(.*?)\](.*?)\[/u r l\]#i (con u r l senza spazi)
    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. (naturamelmente il 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 [ u r l=] troverà un f t p/http o un w w w; per non parlare quando metto il tag [u r l=] personalizzato e scrivo [u r l]http://w w w.[/url] , in quanto me lo applica tre volte.).

    come posso risolvere?

    saluti, e grazie per l'attenzione

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.