2012-09-13 13 views
7

Białe spacje w plikach PHP są czasami problematyczne, dlatego próbuję znaleźć pliki, które spełniają typowe, problematyczne kryteria. Próbuję znaleźć wszystkie pliki rekursywnie, które mają jeden lub oba te warunki:Znaleźć pliki PHP wstrzykujące białe spacje

1) Nie rozpoczyna się od znaku < lub #.

i/lub

2) nie kończy się w > charakteru, chyba że ma końca w ścisłej nawias której następuje dowolnej ilości nowych linii.

myślę, że pierwszy warunek będzie: $[^<#]

myślę, że drugi warunek będzie: [ [^>^] | [}\n*^]]

jednak pamiętać, że w moich naiwnych regexes $ i ^ stanowią początek i koniec plik, a nie jakiejkolwiek linii w pliku. A nawet z tymi, zakładając, że są poprawne, jak mógłbym je połączyć? Podoba ci się?

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

Następnie, umieszczając je w grep:

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

Oczywiście, to nie działa (tm). Czy ktoś może nauczyć mnie poprawiania błędów? Dzięki.

To dobry plik:

<?php 

?> 

Więc to:

<?php 
function someFunc(){ 
} 


‏ 

I to jest dobre: ​​

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

Główny HTML jest w porządku:

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

Trailing HTML jest zbyt dobrze:

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

To jest złe (prowadząca nowej linii):

‏ 
<?php 

?> 

To jest złe zbyt (prowadzące spacja):

‏ <?php 

?> 

Jest źle, jak cóż (trailing newline):

<?php 

?> 
‏ 
+0

Jednym z najprostszych sposobów na uniknięcie tego problemu jest NIE dołączanie zamykającego '?>' Na końcu plików. Jest to poprawne PHP i jest zawarte w wielu popularnych standardach kodowania PHP, w tym w standardzie kodowania PEAR. Kończenie plików przy pomocy '?>' Oznacza kłopot. –

+0

Pomysł, który możesz wziąć pod uwagę: włącz buforowanie wyjściowe, plik 'include()' i sprawdź, czy dane wyjściowe generowane podczas dołączania zawierają wiodące/końcowe spacje. –

+0

Dziękuję Frank. Jednak pliki kończące się na '?>' Są poprawnymi plikami PHP, nie powodują błędu i są bardzo powszechne. Nie będę dyskutować z innymi deweloperami na ten temat i zmienić ich stylu kodowania, po prostu chcę zautomatyzować proces znajdowania problematycznych plików dla mnie. – dotancohen

Odpowiedz

2

Podniosłem ekspresję bardzo szybko, myślę, że robi to, co chcesz. Jest dość późno i z jakiegoś powodu jestem na stackoverflow. Niezależnie od tego, mam nadzieję, że otrzymałem właściwą prośbę.

Wypróbuj to wyrażenie regularne /\A(?:\s+.*>|[^<#].*>\s*|<.*>\s+)\Z/s. Wyjaśniłem tutaj: http://regex101.com/r/cT7eY5

Mam nadzieję, że ta pomoc.Jeśli w jakiś sposób źle Cię zrozumiałem, proszę wyjaśnij, a spróbuję dostosować wyrażenie.

+0

Dziękuję. To wymaga dużo pracy, ale wydaje mi się, że jest to w dobrym kierunku. Jest również spóźniony! – dotancohen

+0

Zapomniałem flagi 's', która jest niezbędna do działania tego wyrażenia. Jeśli wcześniej go nie używasz, upewnij się, że robisz to teraz. –

+0

Dziękuję Lindrian. Wracając do tego, wydaje mi się, że '\ A' nie pasuje do początku pliku w mojej wersji grep (2.9 na dystrybucji pochodnej Debiana). Czy '\ A' faktycznie pasuje do początku pliku w twoim systemie? Który system? Dzięki. – dotancohen

Powiązane problemy