eliminare match

Ciao gianni sto usando questa regex con preg_match_all :

/:?{{\$([a-z]+)}}/i

ma nonostante non voglia avere le {{,$ e }} nei match questi mi compaiono sempre anche con questa regex

/(:?{{\$([a-z]+)}})/i
testo:
      <p>{{notvar}}</p>
      <p>{{$username}}{{$message}}{{$wrong</p>
      <p>{{text}}</p>

match:
Array
(
    [0] => {{$title}}
    [1] => {{$username}}
    [2] => {{$message}}
)

che sbaglio?

 :bye:

inviato 9 anni fa
Andrea Turso
Andrea Turso
86
X 0 X

cosi funziona?

/\{\{\$([a-z]+)\}\}/i

edit: errore mio, le parentesi grafe vanno escapate

risposto 9 anni fa
Thesee
modificato 9 anni fa
X 0 X

mmh guarda che dovrei solo eliminare {{$ }} dai match, la regex funziona.

risposto 9 anni fa
Andrea Turso
Andrea Turso
86
X 0 X

se ti chiedo se funziona significa se nel match ti restituisce solo le lettere senza le grafe ed il dollaro.

questa regex mi pare diversa dalla tua. L'hai provata? (lo avrei fatto io ma ora non ho modo di provare ::) )

/\{\{\$([a-z]+)\}\}/i

 :)

risposto 9 anni fa
Thesee
X 0 X

mi da gli stess imatch

risposto 9 anni fa
Andrea Turso
Andrea Turso
86
X 0 X

strano....ho riavviato sul mo carissimo linux  ^-^  e cosi ho provato! .....a me funziona.

<?php
$testo = '<p>{{notvar}}</p>
        <p>{{$username}}{{$message}}{{$wrong</p>
        <p>{{text}}</p>';
preg_match_all('/\{\{\$([a-z]+)\}\}/i', $testo, $TestiRiconosciuti);
echo "Debug--><pre>";print_r($TestiRiconosciuti);echo "</pre>";die();
?>

output:

Debug-->

Array
(
    [0] => Array
        (
            [0] => {{$username}}
            [1] => {{$message}}
        )

    [1] => Array
        (
            [0] => username
            [1] => message
        )

)

Se invece vuoi riconoscere tutti i testi a prescindere dal $

/\{[\$|\{]([a-z]+)\}\}/i

da questo risultato:

Debug-->

Array
(
    [0] => Array
        (
            [0] => {{notvar}}
            [1] => {$username}}
            [2] => {$message}}
            [3] => {{text}}
        )

    [1] => Array
        (
            [0] => notvar
            [1] => username
            [2] => message
            [3] => text
        )

)

Tieni conto che:

I testi riconosciuti saranno organizzati in modo tale da avere in $TestiRiconosciuti[0] la matrice di tutti i testi riconosciuti, in $TestiRiconosciuti[1] la matrice di tutti i testi che soddisfino il primo criterio di riconoscimento posto tra parentesi tonde, in $TestiRiconosciuti[2] si avranno i testi che soddisfino il secondo criterio e cosi via. [Fonte php.net]

 ;)

risposto 9 anni fa
Thesee
X 0 X

trovato perchè non funzionava allora :

foreach($vars[0] as $vars){

     $var[] = $vars;

}

ahahahah :2funny:

grazie e sorry se ho dubitato :D

:bye:

risposto 9 anni fa
Andrea Turso
Andrea Turso
86
X 0 X

Ciao Thesee, visto che ne sai più di me sulle espressioni regolari :D volevo chiederti un'an'altro aiutino :

sto scrivendo una regex per i match dei pattern if/else/endif per ora ho scritto questo :

\{\{if\s(\$[a-z]+)\s*(==|!=|>|>=|<|<=|<>|===)\s*(\$[a-z]+)\}\}

certo non è quanto di più ottimizzato possa esistere :D ma è sempre un punto di partenza ;D

quello che non sto riuscendo a fare è avere il match di questo testo e le sostituzioni con una sola pattern :

{{$var}}
{{if $text==$text}}
<p>aaaaaaa</p>
{{else}}
vvvvvvv
{{endif}}

in pratica non riesco a gestire il ritorno a capo ( opzionale ) e il contenuto dei rami vero/falso della struttura alternativa.

Mi sapresti aiutare???

thanks in advance

 :bye:

risposto 9 anni fa
Andrea Turso
Andrea Turso
86
X 0 X

per ora ho questa sostituzione :

      <?php if ($this->_tplVars['index']['text'] == $this->_tplVars['index']['text']){ } ?>
         <p>aaaaaaa</p>
      {{else}}
         <p>vvvvvvv</p>
      {{endif}}

è ovvio che se manca else non devo usare la sostituzione {{else}} -> }else{ .... } ma fare direttamente }

come?

risposto 9 anni fa
Andrea Turso
Andrea Turso
86
X 0 X

ehm giusto un pò curiosità :

-come gestire gli operatori unari ?

-come gestire il raggruppamento delle condizioni con le parentesi?

-come gestire condizioni multiple?

hiihihihi :2funny:

:bye:

risposto 9 anni fa
Andrea Turso
Andrea Turso
86
X 0 X

scusami ...ma non riesco a capire cosa voui matchare e con cosa lo vuoi sostituire  ;D

cmq, per matchare qualsiasi cosa tra le 2 variabili dell'if puoi utilizzare:

preg_match_all('/(\-?0[xX][0-9a-fA-F]+|\-?\d+(?:\.\d+)?|\.\d+|!==|===|==|!=|<>|<<|>>|<=|>=|\&\&|\|\||\(|\)|,|\!|\^|=|\&|\~|<|>|\||\%|\+|\-|\/|\*|\@    | # non-word token
                \b\w+\b                                                        | # valid word token
                \S+                                                           # anything else
                )/', $testo, $TestiRiconosciuti);

mi pare che tu abbia a che fare con un motore di template.....dai un occhio alla classe di Smarty (smarty.php.net che compila i template magari trovi qualche regex decisamente utile.

Seno dimmi esattamente cosa devi fare e cerco di aiutarti volentieri ;)

ciao

risposto 9 anni fa
Thesee
X 0 X

si è proprio un template engine quello che avevo intenzione di fare,certo che puoi aiutarmi!

se hai msn aggiungimi :D ( se vuoi il contatto te lo invio per PM)

ahh : grazie mille per l'aiuto :D sarei diventato vecchio prima di trovare una soluzione

:bye:

risposto 9 anni fa
Andrea Turso
Andrea Turso
86
X 0 X

io sto utilizzando questo metodo per il parsing dei template :

<?php
$_tagOpen = preg_quote($this->_tagOpen,'/');
$_tagClose = preg_quote($this->_tagClose,'/');               
$patterns = array(
   'variables'   => array(
            'pattern' => '/' . $_tagOpen . '[\$|\{]([a-z]+)' . $_tagClose . '/i',
            'replace' => '<?php echo $this->_tplVars[\'' . $tpl . '\'][\'$1\']; ?>'),
   'if'   => array(
            'pattern' => '/' . $_tagOpen . '(\-?0[xX][0-9a-fA-F]+|\-?\d+(?:\.\d+)?|\.\d+|!==|===|==|!=|<>|<<|>>|<=|>=|\&'
                     .'\&|\|\||\(|\)|,|\!|\^|=|\&|\~|<|>|\||\%|\+|\-|\/|\*|\@|\b\w+\b|\S+)' . $_tagClose . '/',
            'replace' => '<?php if($this->_tplVars[\'' . $tpl . '\'][\'$1\'] $2 $this->_tplVars[\'' . $tpl . '\'][\'$3\']){ echo 1; } ?>'),
            );
foreach($patterns as $pattern){
   $source = preg_replace($pattern['pattern'], $pattern['replace'], $source);
}
?>

il tpl è questo :

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html 
     PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
    "DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
   <head>
         <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
         <title>{{$title}}</title>   
   </head>
   <body>
      <p>{{$username}}{{$message}}</p>
      <p>{{text}}</p>
      {{if $text == $othertext}}
         <p>aaaaaaa</p>
      {{else}}
         <p>vvvvvvv</p>
      {{endif}}
   </body>
</html>

il risultato è questo :

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html 
     PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
    "DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
   <head>
         <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
         <title><?php echo $this->_tplVars['index']['title']; ?></title>   
   </head>
   <body>
      <p><?php echo $this->_tplVars['index']['username']; ?><?php echo $this->_tplVars['index']['message']; ?></p>
      <p><?php if($this->_tplVars['index']['text']  $this->_tplVars['index']['']){ echo 1; } ?></p>
      {{if $text == $othertext}}
         <p>aaaaaaa</p>
      <?php if($this->_tplVars['index']['else']  $this->_tplVars['index']['']){ echo 1; } ?>
         <p>vvvvvvv</p>
      <?php if($this->_tplVars['index']['endif']  $this->_tplVars['index']['']){ echo 1; } ?>
   </body>
</html>

devo vedere un'attimo di risistemare le corrispondenze ( $1,$2 ... ).

@Gianni : è conveniente il metodo che sto utilizzando per il parsing? ho visto un TE che "staccava" e isolava il codice tra ogni tag del TE e lo metteva nello stack, poi alla ricompilazione lo rimetteva a posto nell'ordine nel quale era stato preso.

è performante?

risposto 9 anni fa
Andrea Turso
Andrea Turso
86
X 0 X

io userei smarty  :P

risposto 9 anni fa
Gianni Tomasicchio
X 0 X

aahah si infatti lo uso, ma mi piace fare qualcosa di nuovo ogni tanto :D

risposto 9 anni fa
Andrea Turso
Andrea Turso
86
X 0 X

eheh concordo con Gianni  ;)  ma aggiungo anche che stai esattamente replicando smarty  ;D

Cmq, è un bell'esercizio. Mi leggo con calma i post e vedo cosa si può fare

Ciao

risposto 9 anni fa
Thesee
X 0 X

aahah si ho letto il sorgente di smarty ... e l'ho scritto identico :D :2funny:

i commenti sono identici perchè sto usando lo stile PEAR sia per i commenti sia per il codice.

non avevo mai visto il codice di smarty in vita mai ma quando ho visto che anche i nomi delle variabili erano simili mi sono sganasciato dalle risate :2funny:

risposto 9 anni fa
Andrea Turso
Andrea Turso
86
X 0 X
Effettua l'accesso o registrati per rispondere a questa domanda