2012-09-13 20 views
7

A volte lo spazio bianco nei file PHP è problematico, quindi sto cercando di trovare file che soddisfino i più comuni criteri problematici. Sto cercando di trovare tutti i file in modo ricorsivo che hanno una o entrambe queste condizioni:Trova file PHP per iniettare spazi bianchi

1) Non inizia con un carattere < o #.

e/o

2) non termina in un carattere >, a meno che finisce in un tutore stretta che è seguita da qualsiasi quantità di nuove righe.

Penso che la prima condizione sarebbe: $[^<#]

Penso che la seconda condizione sarebbe: [ [^>^] | [}\n*^]]

Si noti tuttavia che nelle mie regex ingenui $ e ^ rappresento l'inizio e la fine del file, non di alcuna riga nel file. E anche con quelli, supponendo che fossero corretti, come li combinerei? Così?

[$[^<#]] | [[ [^>^] | [}\n*^]]] 

Poi, mettendoli in grep:

grep -r [$[^<#]] | [[ [^>^] | [}\n*^]]] * 

Ovviamente, questo non funziona (tm). Qualcuno può insegnarmi come correggere gli errori? Grazie.

Questo è un buon file:

<?php 

?> 

Quindi è questo:

<?php 
function someFunc(){ 
} 


‏ 

E questo è un bene troppo:

#!/usr/bin/php -q 
<?php 
?> 

Leading HTML va bene:

<html> 
<?php 
echo '</html>'; 
?> 

Trailing HTML è troppo bella:

<?php 
echo '<html>'; 
?> 
</html> 

Questo è male (che porta a capo):

‏ 
<?php 

?> 

Questo è troppo male (spazio iniziale):

‏ <?php 

?> 

Questo è male come bene (nuova riga finale):

<?php 

?> 
‏ 
+0

Uno dei modi più semplici per evitare questo problema è NON includere una chiusura '?>' Alla fine dei file. Questo è valido PHP ed è incluso in molti standard di codifica PHP, incluso lo standard di codifica PEAR. La fine dei file con '?>' È un problema. –

+0

Un'idea che potresti prendere in considerazione: attivare il buffering dell'output, 'include()' il file e vedere se l'output che genera quando lo includi ha spazi iniziali o finali. –

+0

Grazie, Frank. Tuttavia, i file che terminano con '?>' Sono file PHP validi, non attivano il bug e sono molto comuni. Non ho intenzione di discutere con altri sviluppatori sull'argomento e modificare il loro stile di codifica, voglio solo automatizzare il processo di ricerca di file problematici per me. – dotancohen

risposta

2

Lanciato un'espressione molto veloce che penso faccia quello che vuoi. È piuttosto tardi e per qualche motivo sono su StackOverflow. Indipendentemente da ciò, spero di aver avuto la tua richiesta giusta.

Prova questa espressione regolare /\A(?:\s+.*>|[^<#].*>\s*|<.*>\s+)\Z/s. Spiegato qui: http://regex101.com/r/cT7eY5

Spero che questo aiuto.Se ti ho frainteso in qualche modo, ti preghiamo di chiarire e cercherò di adattare l'espressione.

+0

Grazie. Ha bisogno di molto lavoro, ma questo mi sta facendo andare nella giusta direzione. È tardi anche qui! – dotancohen

+0

Avevo dimenticato il 's'-flag che è necessario per far funzionare questa espressione. Se non lo avevi usato prima, assicurati di farlo ora. –

+0

Grazie Lindrian. Tornando a questo, non mi sembra che '\ A' corrisponda all'inizio di un file nella mia versione di grep (2.9 su una distro derivata da Debian). '\ A' corrisponde effettivamente all'inizio di un file sul tuo sistema? Quale sistema? Grazie. – dotancohen