2009-10-02 26 views
6

Açıklamaları engellemek için tek satırlı yorumları (//...) dönüştürmek gerekir (/*...*/). Bunu şu kodda neredeyse gerçekleştirdim; Ancak, herhangi bir satır yorumunu atlamak için fonksiyona ihtiyacım var zaten bir blok yorumunda. Şu anda, tek satır yorumu bir blok yorumunda olduğunda bile, herhangi bir tek satırlı yorumla eşleşmektedir.Tek satırlı yorumları tek tek tıklat Geri dön Yorumlar

## 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 
); 
} 

cevap

1

Geride olumsuz bir görünüm deneyebilirsiniz:

## 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 
); 
} 

http://www.regular-expressions.info/lookaround.html ancak onlarda // ile olası dizeleri dert. gibi: $ x = "eğik çizgi ile bazı dize"; Dönüştürülüyor muydu?

Kaynak dosyanız PHP ise, dosyayı daha iyi kesinlikle ayrıştırmak için belirteç kullanabilirsiniz.

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

Düzenleme: Eğer ifadeyi yerleştirerek üstesinden gelebilir sabit uzunlukta, unuttum. Yukarıdakiler şimdi çalışmalıdır.

Daha önce bahsedildiği
$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

Peki, eğer x $ = "eğik çizgi ile bazı dizgiler" ise; $ x = "olur, bazı dizgiler/* eğik çizgi ile * /"; Bu aslında tercih edilirdi. Öte yandan, önerdiğiniz değişiklikleri ekledim ve derleme hatası aldım. Uyarı: preg_replace_callback() [function.preg-replace-callback]: Derleme başarısız oldu: lookbehind onaylaması, offset 6'da C: \ wamp \ www \ LessCSS \ Site \ cleaner \ inc \ util.php satırında sabit uzunluk değil 29 – roydukkey

+1

PHP'nin bakış açısı sadece sabit uzunluktaki onayları destekliyor. Bu, * ve? Kullanımını göz ardı eden tanımlanmamış sayıda karakterle eşleşen bir geriye dönük regex yazamayacağınız anlamına gelir. Daha fazla bilgi için: http://www.php.net/manual/en/regexp.reference.assertions.php –

+0

Başlıklar için teşekkürler. şimdi çalışmalı. –

3

, "//..." blok yorum ve dize hazır içine oluşabilir: Ben bunu test ettik. Bu nedenle, küçük bir "ayrıştırıcı" yaratabilirsiniz ve eğer birtakım regex-hile ile oluşturursanız, bunlardan herhangi birini eşleştirebilirsiniz (string literals veya block-comments) ve bundan sonra "//..." mevcut olup olmadığını test edin. şu çıktıyı üretir

$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"; 
    } 
} 

:

Burada küçük bir demo Tabii

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 

sanırım, orada PHP mümkün fazla dize hazır, ama benim drift olsun.

HTH.