Yorum ve multi-line yorumlarınızı ve boş satırları şerit Regex

5 Cevap php

Bir dosyayı ayrıştırmak istiyorum ve ben php kullanmak ve şerit regex istiyorum:

  • boş veya boş satırlar
  • tek satır yorum
  • Çok satırlı yorumlar

temelde içeren herhangi bir satırı kaldırmak istiyorum

/* text */

veya çok satırlı yorumlar

/***
some
text
*****/

Mümkünse hattı boşsa, başka bir regex (boş satırları kaldırın) kontrol etmek için

Bu mümkün mü? Biri bana yok sadece bir regex gönderebilir miyim?

Çok teşekkürler.

5 Cevap

Eğer ayrıştırma konum dosyası bu koşullara uyan bir şey içeren bir dize varsa kullandığınız herhangi bir regex başarısız olacağını aklınızda bulundurun. Örneğin, bu açacak:

print "/* a comment */";

Bu içine:

print "";

Ne istediğinizi muhtemelen not Hangi. Ama belki de ben bilmiyorum, olduğunu. Neyse, regexes teknik bu sorunu önlemek için bir şekilde veri ayrıştırmak olamaz. Modern PCRE regexes bunu yapabilecek her ikisini de yapmak için kesmek bir dizi tutturdu ve, daha da önemlisi, artık regular ifadeleri, ama ne olursa olsun çünkü ben teknik söylüyorlar. Eğer tırnak içinde veya diğer durumlarda bunları sıyırma kaçınmak istiyorsanız (hala oldukça basit olabilir olsa), bir tam gelişmiş çözümleyici için hiçbir şey tutamaz.

Bu is mümkün, ama bunu yapmayacağım. Eğer gerekli boşluk (dizeleri, anahtar kelimeler / künyeleri (publicfuntiondoStuff (), vb) beween boşluk) kaldırarak değil emin olmak için tüm php dosyasını ayrıştırmak gerekir. Daha tokenizer extension PHP kullanımı.

Bu, tüm / * ile * / değiştirilmesi çalışması gerekir.

$string = preg_replace('/(\s+)\/\*([^\/]*)\*\/(\s+)/s', "\n", $string);

Bir regexp için kullanılan değilse bu, benim çözümdür. Aşağıdaki kod no ayrılmış tüm açıklamayı kaldırmak ve bu tarz ADI = DEĞER değişkenin değerlerini alır

  $reg = array();
  $handle = @fopen("/etc/chilli/config", "r");
  if ($handle) {
   while (($buffer = fgets($handle, 4096)) !== false) {
    $start = strpos($buffer,"#") ;
    $end   = strpos($buffer,"\n");
     // echo $start.",".$end;
       // echo $buffer ."<br>";



     if ($start !== false)

        $res = substr($buffer,0,$start);
    else
        $res = $buffer; 
        $a = explode("=",$res);

        if (count($a)>0)
        {
            if (count($a) == 1 && !empty($a[0]) && trim($a[0])!="")
                $reg[ $a[0] ] = "";
            else
            {
                if (!empty($a[0]) && trim($a[0])!="")
                    $reg[ $a[0] ] = $a[1];
            }
        }




    }

    if (!feof($handle)) {
        echo "Error: unexpected fgets() fail\n";
    }
    fclose($handle);
}

Bu iyi bir işlevi olduğunu ve ÇALIŞIYOR!

<?
if (!defined('T_ML_COMMENT')) {
   define('T_ML_COMMENT', T_COMMENT);
} else {
   define('T_DOC_COMMENT', T_ML_COMMENT);
}
function strip_comments($source) {
    $tokens = token_get_all($source);
    $ret = "";
    foreach ($tokens as $token) {
       if (is_string($token)) {
          $ret.= $token;
       } else {
          list($id, $text) = $token;

          switch ($id) { 
             case T_COMMENT: 
             case T_ML_COMMENT: // we've defined this
             case T_DOC_COMMENT: // and this
                break;

             default:
                $ret.= $text;
                break;
          }
       }
    }    
    return trim(str_replace(array('<?','?>'),array('',''),$ret));
}
?>

Şimdi bazı değişken içerdiği kodu geçen bu işlevin 'strip_comments' kullanıyor:

<?
$code = "
<?php 
    /* this is comment */
   // this is also a comment
   # me too, am also comment
   echo "And I am some code...";
?>";

$code = strip_comments($code);

echo htmlspecialchars($code);
?>

Çıkışı olarak neden olacaktır

<?
echo "And I am some code...";
?>

Bir php dosyasından yüklüyor:

<?
$code = file_get_contents("some_code_file.php");
$code = strip_comments($code);

echo htmlspecialchars($code);
?>

Bir php dosyası yüklenirken yorum sıyırma ve geri kaydetmeden

<?
$file = "some_code_file.php"
$code = file_get_contents($file);
$code = strip_comments($code);

$f = fopen($file,"w");
fwrite($f,$code);
fclose($f);
?>

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