2009-10-02 15 views
6

टिप्पणियों को अवरोधित करने के लिए मुझे सिंगल लाइन टिप्पणियां (//...) रूपांतरित करने की आवश्यकता है (/*...*/)। मैंने इसे निम्नलिखित कोड में लगभग पूरा कर लिया है; हालांकि, मुझे किसी भी पंक्ति टिप्पणी को छोड़ने के लिए फ़ंक्शन की आवश्यकता है पहले से ही ब्लॉक टिप्पणी में है। वर्तमान में यह किसी एकल पंक्ति टिप्पणी से मेल खाता है, भले ही एकल पंक्ति टिप्पणी ब्लॉक टिप्पणी में हो।टिप्पणियों को ब्लॉक करने के लिए सिंगल लाइन टिप्पणियों को कनवर्ट करें

## Convert Single Line Comment to Block Comments 
function singleLineComments(&$output) { 
    $output = preg_replace_callback('#//(.*)#m', 
    create_function(
    '$match', 
    'return "/* " . trim(mb_substr($match[1], 0)) . " */";' 
    ), $output 
); 
} 

उत्तर

1

आप के पीछे एक नकारात्मक देखो की कोशिश कर सकते: http://www.regular-expressions.info/lookaround.html

## Convert Single Line Comment to Block Comments 
function sinlgeLineComments(&$output) { 
    $output = preg_replace_callback('#^((?:(?!/\*).)*?)//(.*)#m', 
    create_function(
    '$match', 
    'return "/* " . trim(mb_substr($match[1], 0)) . " */";' 
), $output 
); 
} 

लेकिन मैं उन्हें // के साथ संभव तार के बारे में चिंता। जैसे: $ x = "कुछ स्ट्रिंग // स्लेश के साथ"; परिवर्तित हो जाएगा।

यदि आपकी स्रोत फ़ाइल PHP है, तो आप बेहतर परिशुद्धता के साथ फ़ाइल को पार्स करने के लिए टोकनेज़र का उपयोग कर सकते हैं।

http://php.net/manual/en/tokenizer.examples.php

संपादित करें: निश्चित लंबाई, जो आप अभिव्यक्ति घोंसले बनाने के दूर कर सकते हैं के बारे में भूल। उपर्युक्त अब काम करना चाहिए।

$foo = "// this is foo"; 
sinlgeLineComments($foo); 
echo $foo . "\n"; 

$foo2 = "/* something // this is foo2 */"; 
sinlgeLineComments($foo2); 
echo $foo2 . "\n"; 

$foo3 = "the quick brown fox"; 
sinlgeLineComments($foo3); 
echo $foo3. "\n";; 
+0

वैसे मैं चिंतित नहीं हूं अगर $ x = "कुछ स्ट्रिंग // स्लेश के साथ //; $ x = "कुछ स्ट्रिंग/* स्लेश के साथ * /" हो जाता है; वास्तव में इसे प्राथमिकता दी जाएगी। दूसरी ओर, मैंने आपके द्वारा सुझाए गए परिवर्तनों को जोड़ा और संकलन त्रुटि प्राप्त की। चेतावनी: preg_replace_callback() [function.preg-replace-callback]: संकलन विफल: देखें कि दावा सी में ऑफसेट 6 पर तय नहीं है 6: \ wamp \ www \ LessCSS \ साइट \ क्लीनर \ inc \ util.php लाइन पर 2 9 – roydukkey

+1

PHP का लुक-बैक केवल निश्चित लंबाई के दावों का समर्थन करता है। इसका मतलब है कि आप एक लुक-बैक रेगेक्स नहीं लिख सकते हैं जो कि अनिश्चित संख्या में वर्णों से मेल खाता है, जो * और? के उपयोग को नियंत्रित करता है। यहां अधिक जानकारी: http://www.php.net/manual/en/regexp.reference.assertions.php –

+0

सिर के लिए धन्यवाद। अब काम करना चाहिए –

3

जैसा कि पहले ही उल्लेख किया है, "//..." ब्लॉक टिप्पणियों और स्ट्रिंग शाब्दिक अंदर हो सकता है: मैं के साथ यह परीक्षण किया गया। तो यदि आप सहायता एफ के साथ एक छोटा "पार्सर" बनाते हैं, तो आप कुछ चीजें (स्ट्रिंग अक्षर या ब्लॉक-टिप्पणियां) से मेल खाते हैं, और उसके बाद, परीक्षण करें कि "//..." मौजूद है या नहीं।

$code ='A 
B 
// okay! 
/* 
C 
D 
// ignore me E F G 
H 
*/ 
I 
// yes! 
K 
L = "foo // bar // string"; 
done // one more!'; 

$regex = '@ 
    ("(?:\\.|[^\r\n\\"])*+") # group 1: matches double quoted string literals 
    | 
    (/\*[\s\S]*?\*/)   # group 2: matches multi-line comment blocks 
    | 
    (//[^\r\n]*+)    # group 3: matches single line comments 
@x'; 

preg_match_all($regex, $code, $matches, PREG_SET_ORDER | PREG_OFFSET_CAPTURE); 

foreach($matches as $m) { 
    if(isset($m[3])) { 
    echo "replace the string '{$m[3][0]}' starting at offset: {$m[3][1]}\n"; 
    } 
} 

निम्नलिखित में से कौन उत्पादन का उत्पादन:

यहां एक छोटा डेमो है

replace the string '// okay!' starting at offset: 6 
replace the string '// yes!' starting at offset: 56 
replace the string '// one more!' starting at offset: 102 
बेशक

, वहाँ अधिक स्ट्रिंग PHP में संभव शाब्दिक मुझे लगता है, लेकिन आप मेरी बहाव मिलता है।

एचटीएच।

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