Yorumlar Blok Tek Hat Yorumlar dönüştürmek

2 Cevap php

I (//...) yorumları engellemek için tek satır yorum dönüştürmek gerekir (/*...*/). Neredeyse aşağıdaki kodda bu başarılı; Ancak, herhangi bir tek satır açıklama Blok yorumun zaten atlamak işlev gerekir. Tek satırlık açıklama Blok yorumun olsa bile Şu anda, herhangi bir tek satır yorum eşleşir. Böyle bir şey olamaz. Bu btw PHP. Şimdiden yardım için teşekkürler!

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

2 Cevap

Daha önce bahsedildiği gibi, "//..." blok yorumlar ve dize hazır içinde oluşabilir. Eğer regex-hile yardım fa bit küçük bir "ayrıştırıcı" yaratmak Yani, ilk önce bu şeyler (dize değişmezleri veya blok-yorum) ya maç olabilir, ve bundan sonra test ise "//... "mevcut.

Burada küçük bir demo:

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

Hangi aşağıdaki çıktıyı üretir:

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

Tabii ki, PHP olası daha dize değişmezleri vardır, ama sen benim drift olsun, sanırım.

HTH.

Sen arkasında olumsuz bir görünüm deneyebilirsiniz: 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
 );
}

however I worry about possible strings with // in them. like: $x = "some string // with slashes"; Would get converted.

Kaynak dosyası PHP ise, daha hassas dosyayı ayrıştırmak için dizgeciklerini kullanabilirsiniz.

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

Edit: Forgot about the fixed length, which you can overcome by nesting the expression. The above should work now. I tested it with:

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