Come faccio a convertire il tag breve php in full

Devo modificare un progetto di un altro ragazzo che ha utilizzato tag short php ovunque nel suo script. Ho il tag breve disabilitato nel mio server. Penso che convertire tutti i tag brevi invece di abilitare il tag breve nel mio server sia il migliore.

Quindi quale modo per andare meglio:

  1. Convertire tutti i tag brevi?

  2. Abilitare il tag breve nel mio server?

  3. Come faccio a convertire tutti i tag brevi in ​​uno completo in batch

La conversione può essere scritta usando http://php.net/manual/en/function.token-get-all.php . A differenza di find & replace, questo non ha effetto sulle dichiarazioni XML e così via. Converting vs. abilitazione ST: dipende. Molti programmatori probabilmente preferiscono <? Php a <?, Quindi quando si converte, il codice sarà più "standard". Tuttavia, l'importzione https://meta.stackoverflow.com/di "standard" -way dipende dalla situazione.

Per gli altri, KoolKabin si riferisce all'uso di <? invece di <?php come tag di apertura per il codice php, solitamente usato in questa forma abbreviata:

 <?= $myvar1, $myvar2 ?> 

Che è equivalente a questo:

 <? echo $myvar1, $myvar2 ?> 

Che è di per sé equivalente a questo, quando il server è configurato con short_open_tag = on in php.ini:

 <?php echo $myvar1, $myvar2 ?> 

Personalmente, convertirò tutti i tag brevi a less che non ci siano molte pagine che non hanno altro che tag brevi.

Scrivere un codice attorno a token_get_all () è la tua scommessa più sicura (come dettaglio in una risposta separata qui), ma potresti essere in grado di farla franca con un semplice script sed :

 sed -e 's/<?\([ \t\r]\)/<?php\1/g' \ -e 's/<?$/<?php/g' \ -e 's/<?=\([ \t\r]\)\?/<?php echo \1/g' 

Fai solo attenzione alle stringhe nel tuo codice (espressioni regolari, in particolare) che potrebbero avere il <? sequenza seguita da un carattere di spazio bianco. Vedi anche: Utili script su una row per sed , where viene sottolineato che la syntax di sed varia e che alcuni non supportno il codice \t (ma è ansible digitare un carattere di tabulazione reale).

nb Attenzione che sed non usa regex di Perl e alless una delle altre risposte qui ha una syntax sed non valida: ad esempio \? in Perl è un punto interrogativo letterale, ma intende ? , che è un punto interrogativo letterale in sed . (Sostituisce anche <?= Con <?php , omettendo erroneamente "echo".)

Ho guardato un po 'di più e modifico la mia precedente risposta a "sicuramente convertirlo". È facile con il converter PHP-CLI qui sotto. Assicurati che il sistema su cui stai short_open_tag=on sia configurato con short_open_tag=on .

 #!php-cli <?php global $argv; $contents = file_get_contents($argv[1]) or die; $tokens = token_get_all($contents); $tokens[] = arrays(0x7E0F7E0F,"",-1); foreach($tokens as $ix => $token) { if(is_arrays($token)) { list($toktype, $src) = $token; if ($toktype == T_OPEN_TAG) { if (($src == "<?") && ($tokens[$ix+1][0] != T_STRING)) { $src = "<?php"; if ($tokens[$ix+1][0] != T_WHITESPACE) { $src .= " "; } } } else if($toktype == T_OPEN_TAG_WITH_ECHO) { $src = "<?php echo"; if($tokens[$ix+1][0] != T_WHITESPACE) { $src .= " "; } } print $src; } else { print $token; } } 

Puoi provare a usare Eclipse PDT, usando la sua ricerca e sostituendo tutto all'interno di un progetto (CTRL + H) per sostituire tutti i tag brevi con tag completi.

La modifica della configuration del server sarebbe probabilmente più veloce. Personalmente non mi preoccuperei di cercare e sostituire, perché, anche se preferisco usare tag normali, è solo una questione di gusti. I tag brevi in ​​conflitto con le dichiarazioni XML non sono un problema serio, poiché puoi semplicemente inserire le dichiarazioni all'interno delle stringhe.

Ricreare in modo definitivo i tag.

Se il tuo codice è su un Unix / Linux / posix, allora qualcosa del genere:

 find ${BASEDIR} -iname \*.php -exec rep_sht_tags.sh {} \; 

where rep_sht_tags.sh contiene qualcosa come:

 #!/bin/bash destdir=`dirname $1` mkdir -p /backup/${destdir} cp $1 /backup/$1 sed 's/<\?=/<?php /' /backup/$1 >$1 

(NB non testato)