Otomatik olarak PHP kodu yorumlarına kaldırmak için en iyi yolu

6 Cevap php

Nedir bir PHP dosyası yorumlarına kaldırmak için en iyi yolu nedir?

Ben şerit boşluk () benzer bir şey yapmak istiyorum - ama o çizgi de sonları kaldırmak olmamalıdır.

EG:

Bunu istiyorum:

<?PHP
// something
if ($whatsit) {
    do_something(); # we do something here
    echo '<html>Some embedded HTML</html>';
}
/* another long 
comment
*/
some_more_code();
?>

olmak için:

<?PHP
if ($whatsit) {
    do_something();
    echo '<html>Some embedded HTML</html>';
}
some_more_code();
?>

(Boş satır yorum kaldırılır nerede kalırsa, o ok olmaz rağmen).

Çünkü ihtiyacının gömülü html korumak için mümkün olmayabilir - google kadar gelmiş şeyler takıldı nedir bu.

6 Cevap

Ben kullanmak istiyorum tokenizer. İşte benim çözüm. PHP 4 ve 5 hem de çalışması gerekir:

$fileStr = file_get_contents('path/to/file');
$newStr  = '';

$commentTokens = array(T_COMMENT);

if (defined('T_DOC_COMMENT'))
    $commentTokens[] = T_DOC_COMMENT; // PHP 5
if (defined('T_ML_COMMENT'))
    $commentTokens[] = T_ML_COMMENT;  // PHP 4

$tokens = token_get_all($fileStr);

foreach ($tokens as $token) {    
    if (is_array($token)) {
        if (in_array($token[0], $commentTokens))
            continue;

        $token = $token[1];
    }

    $newStr .= $token;
}

echo $newStr;

Nasıl okunabilmesi için yeniden biçimlendirmek için PHP_Beautifier gibi bir beautifier sonra kullanarak, boşluklar ve yorumlardan arındırılmış bir dosya oluşturmak için php-w kullanmaya ne dersiniz?

İşte ardışık tüm php bir dizinin içindeki dosyaları ve tüm alt dizinleri tüm yorumları kaldırmak için modifiye yukarıda yayınlanmıştır fonksiyonu, var:

function rmcomments($id) {
    if (file_exists($id)) {
        if (is_dir($id)) {
            $handle = opendir($id);
            while($file = readdir($handle)) {
                if (($file != ".") && ($file != "..")) {
                    rmcomments($id."/".$file); }}
            closedir($handle); }
        else if ((is_file($id)) && (end(explode('.', $id)) == "php")) {
            if (!is_writable($id)) { chmod($id,0777); }
            if (is_writable($id)) {
                $fileStr = file_get_contents($id);
                $newStr  = '';
                $commentTokens = array(T_COMMENT);
                if (defined('T_DOC_COMMENT')) { $commentTokens[] = T_DOC_COMMENT; }
                if (defined('T_ML_COMMENT')) { $commentTokens[] = T_ML_COMMENT; }
                $tokens = token_get_all($fileStr);
                foreach ($tokens as $token) {    
                    if (is_array($token)) {
                        if (in_array($token[0], $commentTokens)) { continue; }
                        $token = $token[1]; }
                    $newStr .= $token; }
                if (!file_put_contents($id,$newStr)) {
                    $open = fopen($id,"w");
                    fwrite($open,$newStr);
                    fclose($open); }}}}}

rmcomments("path/to/directory");

Yakalamak daha az sağlam eşleştirme algoritması (örneğin basit regex) açıkça olmamalıdır zaman burada sıyırma başlayacak olmasıdır:

if (preg_match('#^/*' . $this->index . '#', $this->permalink_structure)) {

Bu kodu etkilemez olmayabilir, ama sonunda birisi script tarafından parça alacak. Yani aksi beklediğinizden daha dil daha anlayan bir yardımcı programını kullanmak zorunda olacak.

Ajax / json tepkiler için, ben HTML / JavaScript kodu yorumlarına kaldırmak için, PHP kodu aşağıdaki kullanın, böylece (benim kod için yaklaşık% 15 kazanç) daha küçük olacaktır.

// Replace doubled spaces with single ones (ignored in HTML any way)
$html = preg_replace('@(\s){2,}@', '\1', $html);
// Remove single and multiline comments, tabs and newline chars
$html = preg_replace(
    '@(/\*([^*]|[\r\n]|(\*+([^*/]|[\r\n])))*\*+/)|((?<!:)//.*)|[\t\r\n]@i',
    '',
    $html
);

Kısa ve etkili, ancak kod itty sözdizimi $ varsa, beklenmedik sonuçlar üretebilir.

UltraEdit, bir veya birden fazla PHP dosyası / s açın ve sonra aşağıdaki Perl regexp ile simple Find&Replace (CTRL+R) kullanabilir gibi zaten bir düzenleyici kullanıyorsanız

(?s)/\*.*\*/

Dikkat Yukarıdaki sıradanifade bir Sring içinde comments de kaldırır, yani echo "hello/*babe*/"; /*babe*/ da kaldırılmış olacaktır. Eğer yanlış size Bul çalıştırmak ve Değiştir komutunu ve oluyor her ne zaman onaylamak zorunda kalacak bir yorum değil bir şey yerini tutmaz kesinlikle emin olmak için, yorum çıkarmak için birkaç dosya varsa Dolayısıyla, bu bir çözüm olabilir değiştirilir.