Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1

    preg_match_all e bbcode

    salve,

    utilizzando questo codice (che fa parte di una funzione a cui va passato l'argomento $string):

    codice:
    /* get [ all object ...] */
    preg_match_all("/(\[OBJECT[^\]]+\])(.*)(\[\/OBJECT_SPAN\])/", $string, $occurrence);
    
    $NewString = $string;
    
    reset($occurrence);
    while(list($kO, $obj) = each($occurrence[1])) {
    	  /* get properties from [object ...] */
    	  preg_match_all("/([\w]+='[àèìòùé\w\s\#\%\_\.\,\/\+\-]+')/", $obj, $KK);
    
    	  /* replace key='val' to key=val */
    	  $PR = preg_replace("/([\w]+)='([àèìòùé\w\s\#\%\_\.\,\/\+\-]+)'/", "$1=$2", $KK[1]);
    
    	  /* convert obtained string to associative array */
    	  $props = array();
    	  foreach($PR as $line) {
    		list($key, $val) = explode('=', $line);
    		$props[$key] = $val;
    	  }
    
    	  $thisObject = "";
    
    	  if($props['type'] == "SPAN") {
    		$titleSpan = ($props['L'] != "null") ? ' title="'.url_decode($props['L']).'"' : "" ;
    
    		$pFont = explode(",", $props['F']);
    
    		//line-height per alzare il line height indipendentemente dalla dimensione del testo
    		$lh_default = "140%";//1.41;
    
    		$familyFont = ($pFont[0] != "default") ? "font-family:'".url_decode($pFont[0])."';" : "" ;
    
    		$sizeFont = (($pFont[1] != "0em") && ($pFont[1] != "0px")) ? 'font-size:'.$pFont[1].';line-height:'.$lh_default.';' : "" ;
    
    		$weightFont = ($pFont[2] != "none") ? 'font-weight:'.$pFont[2].';' : "" ;
    		$styleFont = ($pFont[3] != "none") ? 'font-style:'.$pFont[3].';' : "" ;
    		$colorFont = ($pFont[4] != $pFont[9]) ? 'color:#'.$pFont[4].';' : "" ;
    
    		$colorBkgFont = ($pFont[5] != $pFont[10]) ? 'background:#'.$pFont[5].';' : "" ;
    		$alignText = ($pFont[6] != "none") ? 'text-align:'.$pFont[6].';' : "" ;
    		$decoreText = ($pFont[7] != "none") ? 'text-decoration:'.url_decode($pFont[7]).';' : "" ;
    		$transformText = ($pFont[8] != "none") ? 'text-transform:'.$pFont[8].';' : "" ;
    
    		$FormatSpan = $familyFont.$sizeFont.$weightFont.$styleFont.$colorFont.$colorBkgFont.$alignText.$decoreText.$transformText;
    
    		$FormatSpan = ($FormatSpan != "") ? ' style="'.$FormatSpan.'"' : "" ;
    
    		$thisObject = '<span'.$FormatSpan.''.$titleSpan.'>'.$FormattedText.'</span>';
    
    	  }
    
    	  $NewString = str_replace($obj, $thisObject, $NewString);
    	}
    e alla funzione che utilizza il precedente codice gli passo un testo simile:


    Aliquam sed turpis metus, vel ultricies leo. Morbi nec elit neque.
    <hr />


    [OBJECT type='SPAN' F='Courier+New,0em,bold,none,252525,ffffff,none,no ne,none,252525,ffffff' L='null']tanto va la gatta al largo che ci lascia lo zampino[/OBJECT_SPAN]



    <hr />
    Ut ac scelerisque turpis. Etiam dapibus dolor sed justo placerat id mollis nisi placerat


    dove la stringa "tanto va la gatta al largo che ci lascia lo zampino" deve essere formattata con i parametri indicati in F

    la conversione avviene perfettamente solo che c'è qualche pezzo in più e adesso mostro il codice html che viene creato:

    codice:
    
    <span style="font-family:'Courier New';font-weight:bold;">
    tanto va la gatta al largo che ci lascia lo zampino</span>
    tanto va la gatta al largo che ci lascia lo zampino[/OBJECT_SPAN]
    insomma il testo in rosso è in più!!! come modifico il codice per fare in modo che il testo in più sparisca??

    Grazie in anticipo..
    www.skorpiograph.com - [ PORTFOLIO ]
    ...se vuoi essere aiutato devi aiutare chi ti aiuta ad aiutarti!!!

  2. #2
    Con tutti quei test mi stava venendo il mal di testa

    Io farei qualcosa del genere

    codice:
    <?php
    
    $string = "Aliquam sed turpis metus, vel ultricies leo. Morbi nec elit neque.
    <hr />
    
    
    [OBJECT type='SPAN' F='Courier+New,0em,bold,none,252525,ffffff,none,none,none,252525,ffffff' L='null']tanto va la gatta al largo che ci lascia lo zampino[/OBJECT_SPAN]
    
    
    
    <hr />
    Ut ac scelerisque turpis. Etiam dapibus dolor sed justo placerat id mollis nisi placerat";
    
    preg_match_all("#\[OBJECT\s+type='(.*?)'\s+F='(.*?)'\s+L='(.*?)'\](.*?)\[/OBJECT_SPAN\]#", $string, $match);
    
    # print_r($match);
    
    $css_properties = array('font-family: ',
                            'font-size: ',
                            'font-weight: ',
                            'font-style: ',
                            'color: #',
                            'background: #',
                            'text-align: ',
                            'text-decoration: ',
                            'text-transform: ');
    
    $full_match = $match[0][0];
    $tag        = $match[1][0];
    $style      = urldecode($match[2][0]);
    $title      = urldecode($match[3][0]);
    $text       = $match[4][0];
    $css_values = split(",", $style);
    
    if ($title != 'null') {
    	$output = "<$tag title=\"$title\" style=\"";
    } else {
    	$output = "<$tag style=\"";
    }
    
    for ($x = 0; $x < 8; $x++) {
    	if ($css_values[$x] != 'none') {
    		$output .= "{$css_properties[$x]}{$css_values[$x]}; ";
    	}
    }
    
    $output .= "\">$text</$tag>";
    $string = str_replace($full_match, $output, $string);
    echo $string;
    
    ?>
    Ovviamente questo funziona solo col primo OBJECT trovato, va generalizzato per considerarli tutti usando la parte 'b' $match[a][b]

  3. #3
    ciao k.b

    grazie prima di tutto per il tuo aiuto e scusa per il mal di testa che ti ho causato. Ti devo un Moment

    Io ti ringrazio ancora per il tuo aiuto ma la funzione è molto più lunga di quello che ho postato perchè si occupa di sostituire anche altri oggetti come ad esempio immagini, liste, link, email, etc...

    Quindi come potrai ben capire dovrei riadattare tutto il lavoro e sinceramente non ne ho ne il tempo ne tantomeno la voglia..... il mio dilemma sta solo nel poter eliminare quel pezzo che si ostina a comparire!!!

    sono riuscito a eliminare il tag di chiusura inserendo questo:
    codice:
    $string =  preg_replace("/(\[\/OBJECT_SPAN\])/", "", $string);
    prima di questo:

    codice:
    $NewString = $string;
    molto poco elegante ma funzionale!!

    il fatto comunque è che non sono ancora riuscito a eliminare il testo raddoppiato.... mannaggia!!

    se hai/avete altre dritte io son qui che provo.... alhoa....
    www.skorpiograph.com - [ PORTFOLIO ]
    ...se vuoi essere aiutato devi aiutare chi ti aiuta ad aiutarti!!!

  4. #4
    Prova a stampare $obj, probabilmente contiene solo la parte di stringa [OBJECT...] e non il testo interno al tag, quindi str_replace() sostituisce quello e si ritrova di nuovo il testo in coda alla sostituzione.

  5. #5
    Originariamente inviato da k.b
    Prova a stampare $obj, probabilmente contiene solo la parte di stringa [OBJECT...] e non il testo interno al tag,....
    infatti hai ragione...

    Originariamente inviato da k.b
    quindi str_replace() sostituisce quello e si ritrova di nuovo il testo in coda alla sostituzione.
    e quindi come lo elimino quel doppione??

    Dai, dai che ci siamo quasi...
    Thank's...
    www.skorpiograph.com - [ PORTFOLIO ]
    ...se vuoi essere aiutato devi aiutare chi ti aiuta ad aiutarti!!!

  6. #6
    Usando $occurrence[0][$x]

    Il primo valore dell'array popolato da preg_match(_all) e' il match completo, $x e' il numero del match: 0 il primo OBJECT, 1 il secondo, etc.

  7. #7
    Originariamente inviato da k.b
    Usando $occurrence[0][$x]

    Il primo valore dell'array popolato da preg_match(_all) e' il match completo, $x e' il numero del match: 0 il primo OBJECT, 1 il secondo, etc.
    temo di non aver capito bene!! so che il preg_match(all) crea un array e il primo valore è quello completo ma non riesco cmq a capire come io possa fare per eliminare la stringa doppia...


    poi dato che ci sono....se invece di:

    codice:
    $string =  preg_replace("/(\[\/OBJECT_SPAN\])/", "", $string);
    io volessi avere un [/OBJECT] (solo) oppure [/OBJECT_LINK] come posso trasformare la precedente riga??

    ...rigrazie...
    www.skorpiograph.com - [ PORTFOLIO ]
    ...se vuoi essere aiutato devi aiutare chi ti aiuta ad aiutarti!!!

  8. #8
    Originariamente inviato da CeMax-2000
    temo di non aver capito bene!! so che il preg_match(all) crea un array e il primo valore è quello completo ma non riesco cmq a capire come io possa fare per eliminare la stringa doppia...
    Il fatto e' che tu usi $occurrence[1] (nel while), quindi prendi il contenuto delle prime parentesi tonde, e cioe' solo [OBJECT....], invece se prendi il valore da $occurrence[0] hai il match completo (probabilmente devi rifare un po' il while, magari trasformandolo in un for).

    poi dato che ci sono....se invece di:

    codice:
    $string =  preg_replace("/(\[\/OBJECT_SPAN\])/", "", $string);
    io volessi avere un [/OBJECT] (solo) oppure [/OBJECT_LINK] come posso trasformare la precedente riga??

    ...rigrazie...
    Intanto non usare le parentesi tonde quando non servono; se vuoi trovare [OBJECT] ma anche [OBJECT_QUALUNQUECOSA] puoi usare questo pattern:

    codice:
    $string =  preg_replace("#\[/OBJECT(_[A-Z]+)?\]#", "", $string);

  9. #9
    Un appunto sulla regex: aggiungendo il modificatore di criterio "s" e "?" l'espressione regolare permette di matchare stringhe che vanno a capo e tag successivi.

    codice:
    da
    "/(\[OBJECT[^\]]+\])(.*)(\[\/OBJECT_SPAN\])/"
    a
    "/(\[OBJECT[^\]]+\])(.*?)(\[\/OBJECT_SPAN\])/s"
    per il problema della ripetizione è come dice k.b. Prova a sostituire
    Codice PHP:
    # questo
     
    $NewString str_replace($obj$thisObject$NewString);
    #con questo
     
    $NewString str_replace($occurrence[0][$kO], $thisObject$NewString); 
    dA .. foto di viaggio
    L'esperienza è il tipo di insegnante più difficile.
    Prima ti fa l'esame, e poi ti spiega la lezione.

  10. #10
    Originariamente inviato da k.b
    Il fatto e' che tu usi $occurrence[1] (nel while), quindi prendi il contenuto delle prime parentesi tonde, e cioe' solo [OBJECT....], invece se prendi il valore da $occurrence[0] hai il match completo (probabilmente devi rifare un po' il while, magari trasformandolo in un for).
    credo di aver capito... adesso ci provo...

    Originariamente inviato da k.b
    Intanto non usare le parentesi tonde quando non servono; se vuoi trovare [OBJECT] ma anche [OBJECT_QUALUNQUECOSA] puoi usare questo pattern:

    codice:
    $string =  preg_replace("#\[/OBJECT(_[A-Z]+)?\]#", "", $string);
    si ma lo avevo fatto e non funzionava e ora grazie a te mi sono accorto di aver messo il tutto in parentesi tonde invece di (_[A-Z]+) soltanto.....

    ti farò sapere... ciauz...
    www.skorpiograph.com - [ PORTFOLIO ]
    ...se vuoi essere aiutato devi aiutare chi ti aiuta ad aiutarti!!!

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.