2012-09-13 2 views
7

PHP dosyalarındaki boşluk bazen sorunludur, bu yüzden ortak sorunlu kriterleri karşılayan dosyaları bulmaya çalışıyorum. Bu koşullardan birini veya her ikisini de içeren yinelemeli dosyaları bulmaya çalışıyorum:Beyaz boşluklu PHP dosyalarını bulun

1) < veya # karakteriyle başlamıyor. Bu yeni satır herhangi bir miktarda izler yakın bir mesnet içinde son yapmazsa

ve/veya

2), bir > karakter bitmez.

Ben ilk şartı olacağını düşünüyorum: [ [^>^] | [}\n*^]]

Ancak, benim naif regexes $ unutmayın ve ^ başlangıcını ve sonunu temsil: $[^<#]

Ben ikinci şartı olacağını düşünüyorum dosya, dosyadaki herhangi bir satır değil. Ve onlarla bile, doğru olduklarını varsayarsak, onları nasıl birleştiririm? Öyle mi?

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

Sonra grep koymadan:

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

Açıkçası, bu (tm) Çalışmıyor edilir. Birisi bana hataların nasıl düzeltileceğini öğretebilir mi? Teşekkürler.

Bu iyi dosyasıdır:

<?php 

?> 

Yani şudur:

<?php 
function someFunc(){ 
} 


‏ 

Ve bu çok iyi:

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

Öncü HTML gayet:

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

Firar HTML çok ince:

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

Bu (lider satır) kötü:

‏ 
<?php 

?> 

Bu çok kötü (lider boşluk):

‏ <?php 

?> 

Bu kadar kötü iyi (sondaki satır):

<?php 

?> 
‏ 
+0

Bu sorunu önlemenin en kolay yollarından biri, dosyaların sonunda bir '? Bu geçerli bir PHP'dir ve PEAR kodlama standardı dahil olmak üzere birçok ana PHP kodlama standardına dahil edilmiştir. "?>" Ile biten dosyaları sorunluyor. –

+0

Göz önünde bulundurmanız gereken bir fikir: çıktı arabelleklemesi, 'include()' dosyasını açın ve eklediğinizde çıktının oluşturulup oluşturulmadığına ya da son noktaya sahip olup olmadığına bakın. –

+0

Teşekkür ederim Frank. Ancak,?> 'Ile biten dosyalar geçerli PHP dosyalarıdır, hatayı tetiklemez ve çok yaygındır. Konuyla ilgili diğer devlerle tartışmayacağım ve kodlama stilini değiştirmeyeceğim, sadece benim için sorunlu dosyaları bulma sürecini otomatikleştirmek istiyorum. – dotancohen

cevap

2

İstediğiniz şeyi yaptığını düşündüğüm bir ifadeyi hızlıca buldunuz. Buraya oldukça geç oldu ve bir sebepten dolayı stackoverflow'tayım. Yine de umarım isteğinizi doğru anladım.

Bu normal ifadeyi deneyin /\A(?:\s+.*>|[^<#].*>\s*|<.*>\s+)\Z/s. Burada anlatılanlar: http://regex101.com/r/cT7eY5

Umarım bu yardım.Seni herhangi bir şekilde yanlış anladıysam, lütfen açıklığa kavuşturun ve ifadeyi ayarlamaya çalışacağım.

+0

Teşekkür ederiz. Çok fazla işe ihtiyaç var ama bence bu doğru yöne geliyor. Onun da geç burada! – dotancohen

+0

Bu ifadenin çalışması için gerekli olan 's 'bayrağını unutmuştum. Daha önce kullanmadıysanız, şimdi yaptığınızdan emin olun. –

+0

Teşekkür ederim Lindrian. Buna geri dönüyorum, bana öyle geliyor ki, '\ A' bir dosyanın başlangıcına grep versiyonumda denk geliyor (2,9, Debian türetilmiş dağıtımda). '\ A' aslında sisteminizdeki bir dosyanın başlangıcıyla eşleşiyor mu? Hangi sistem? Teşekkürler. – dotancohen