2012-09-13 11 views
7

PHP फ़ाइलों में व्हाइटस्पेस कभी-कभी समस्याग्रस्त होती है, इसलिए मैं उन फ़ाइलों को ढूंढने की कोशिश कर रहा हूं जो सामान्य समस्याग्रस्त मानदंडों को पूरा करते हैं। मैं उन सभी फ़ाइलों को रिकर्सिवली खोजने की कोशिश कर रहा हूं जिनमें इनमें से एक या दोनों स्थितियां हैं:व्हाईटस्पेस-इंजेक्शनिंग PHP फाइलें

1) < या # वर्ण से शुरू नहीं होता है।

और/या

2) एक > चरित्र में समाप्त नहीं होता, जब तक यह एक करीबी ब्रेस जो नई-पंक्तियों की किसी भी राशि के बाद में अंत करता है।

मुझे लगता है कि पहली शर्त होगा: $[^<#]

मुझे लगता है कि दूसरी शर्त होगा: [ [^>^] | [}\n*^]]

हालांकि, ध्यान दें कि मेरी भोली regexes $ में और ^ प्रारंभ और के अंत का प्रतिनिधित्व फाइल, फ़ाइल में किसी भी लाइन के नहीं। और यहां तक ​​कि उन लोगों के साथ, यह मानते हुए कि वे सही थे, मैं उन्हें कैसे जोड़ूं? इस तरह?

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

फिर, ग्रेप में उन्हें डाल: जाहिर है

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

, इस काम नहीं कर रहा है (टीएम)। क्या कोई मुझे गलतियों को सही करने के लिए सिखा सकता है? धन्यवाद।

यह एक अच्छा फ़ाइल है:

<?php 

?> 

तो यह है:

<?php 
function someFunc(){ 
} 


‏ 

और यह भी अच्छा है:

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

अग्रणी एचटीएमएल ठीक है:

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

ट्रेलिंग एचटीएमएल भी ठीक है:

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

यह बुरा (प्रमुख newline) है:

‏ 
<?php 

?> 

यह बहुत बुरा है (प्रमुख अंतरिक्ष):

‏ <?php 

?> 

यह के रूप में बुरा है अच्छी तरह से (पिछली नई रेखा):

<?php 

?> 
‏ 
+0

इस समस्या से बचने के सबसे आसान तरीकों में से एक फाइलों के अंत में एक समापन '?>' शामिल नहीं है। यह मान्य PHP है, और पीयर कोडिंग मानक सहित कई मुख्यधारा के PHP कोडिंग मानकों में शामिल है। '?>' वाली फाइलें समाप्त करना परेशानी के लिए पूछ रहा है। –

+0

एक विचार जिसे आप विचार कर सकते हैं: आउटपुट बफरिंग चालू करें, 'फ़ाइल शामिल करें), और देखें कि जब आप इसे शामिल करते हैं तो आउटपुट उत्पन्न होता है तो इसमें व्हाइटस्पेस अग्रणी/पिछला होता है। –

+0

धन्यवाद फ्रैंक। हालांकि, '?>' में समाप्त होने वाली फ़ाइलें मान्य PHP फ़ाइलें हैं, बग को ट्रिगर न करें, और बहुत आम हैं। मैं इस विषय पर अन्य देवताओं के साथ बहस नहीं कर रहा हूं और अपनी कोडिंग शैली बदल रहा हूं, मैं सिर्फ मेरे लिए समस्याग्रस्त फाइलों को ढूंढने की प्रक्रिया को स्वचालित करना चाहता हूं। – dotancohen

उत्तर

2

एक अभिव्यक्ति को वास्तविक रूप से टॉस अप किया जो मुझे लगता है कि आप जो चाहते हैं वह करता है। यह बहुत देर हो चुकी है और किसी कारण से मैं स्टैक ओवरफ्लो पर हूं। भले ही, मुझे आशा है कि मुझे आपका अनुरोध सही मिलेगा।

इस नियमित अभिव्यक्ति को /\A(?:\s+.*>|[^<#].*>\s*|<.*>\s+)\Z/s आज़माएं। यहां समझाया गया: http://regex101.com/r/cT7eY5

मुझे यह सहायता चाहिए।अगर मैंने आपको किसी भी तरह से गलत समझा, तो कृपया स्पष्टीकरण दें और मैं अभिव्यक्ति को समायोजित करने का प्रयास करूंगा।

+0

धन्यवाद। इसे बहुत सारे काम की ज़रूरत है, लेकिन यह मुझे सही दिशा में ले जा रहा है। यहां भी देर हो चुकी है! – dotancohen

+0

मैं इस अभिव्यक्ति के लिए काम करने के लिए जरूरी 'झंडा' भूल गया था। यदि आप पहले इसका उपयोग नहीं कर रहे थे, तो सुनिश्चित करें कि अब आप करें। –

+0

धन्यवाद लिंड्रियन। इस पर वापस आना, ऐसा लगता है कि '\ A' grep के मेरे संस्करण में एक फ़ाइल की शुरुआत से मेल खाता है (2.9 डेबियन व्युत्पन्न डिस्ट्रो पर)। क्या \ \ वास्तव में आपके सिस्टम पर एक फ़ाइल की शुरुआत से मेल खाता है? कौन सी व्यवस्था? धन्यवाद। – dotancohen

संबंधित मुद्दे