(Php) yorumları kaldırmak ama dizeleri içinde tekrarlarını görmezden regexto

3 Cevap php

Ben comment-striptizci yazma ve burada tüm ihtiyaçları için karşılamak için çalışıyorum. Ben hemen hemen tüm yorumları kaldırır kodunun altında yığını var, ama aslında çok ileri gider. Çok zaman çalışıyor ve maç için regex desenleri test ve araştırma geçti, ama onlar her en iyi olduğunu iddia etmiyorum.

Benim sorunum ben de ben aslında kaldırdık istemiyorum standart kodu 'gerçekten yorumlar değildir' PHP yorumlarınıza '(, hatta PHP dizeleri var durum olması.

Örnek:

<?php $Var = "Blah blah //this must not comment"; // this must comment. ?>

Ne oluyor bitiyor o ince olduğu, din üzerinden şeritler, ancak bazı sorunlar bırakıyor olması:

<?php  $Var = "Blah blah  ?>

Ayrıca:

Yorum biten dahil satırın kalanını kaldırır aynı zamanda, sorunlara neden olur?>

Sorunu bakın? Yani bu ne ihtiyacım olduğunu ...

  • Içinde'' veya Yorum karakterler "" göz ardı edilmesi gerekir
  • Çift bölü kullanın, aynı hat üzerinde PHP Yorumlar, sadece yorum kendisi belki kaldırmak gerekir, ya da tüm php codeblock kaldırmanız gerekir.

İşte şu anda kullandıkları desenler bulunuyor, benim mevcut desen yapabilirsiniz düzelme varsa söyle çekinmeyin? :)

$CompressedData = $OriginalData;
$CompressedData = preg_replace('!/\*.*?\*/!s', '', $CompressedData);  // removes /* comments */
$CompressedData = preg_replace('!//.*?\n!', '', $CompressedData); // removes //comments
$CompressedData = preg_replace('!#.*?\n!', '', $CompressedData); // removes # comments
$CompressedData = preg_replace('/<!--(.*?)-->/', '', $CompressedData); // removes HTML comments

Bana verebileceğiniz herhangi bir yardım büyük mutluluk duyacağız! :)

3 Cevap

PHP ayrıştırmak istiyorsanız, token_get_all to get the tokens Belirli bir PHP kodu kullanabilirsiniz. Sonra sadece, belirteçleri yinelemek açıklama simgeleri çıkarın ve tekrar bir araya dinlenme koymak gerekir.

Ancak (DOMDocument::loadHTML ile sağlamaktadır DOMDocument gibi) da, HTML yorumlar için tercihen gerçek ayrıştırıcı ayrı bir prosedür gerekir.

Önce gerçekten bunu isteyip dikkatle düşünmek gerekir. Ne yaptığınızı basit görünse de, en kötü durum senaryosunda, son derece karmaşık bir sorun (sadece birkaç düzenli ifadeler ile çözmek için) olur. Bana sadece, sadece bir dosyadan HTML ve PHP yorumlarınızı hem şerit çalışırken size dönük olacak birkaç sorunlarından açıklayalım.

Yapamazsınız düz şerit HTML yorumlar, sizin gibi, HTML yorumların içinde PHP olabilir, çünkü:

<!-- HTML comment <?php echo 'Actual PHP'; ?> -->

Sen sadece basit ayrı <?php iç malzeme ile anlaşma ve bitiş thag ?> gibi, içeride dizeleri hatta yorum olabilir beri ?>, ya da etiketleri olamaz :

<?php /* ?> This is still a PHP comment <?php */ ?>

Şimdi bunu bir satır açıklama öncesinde eğer ?> aslında, PHP biter, unutmayalım. Örneğin:

<?php // ?> This is not a PHP comment <?php ?>

Zaten resimli gibi tabii ki, dizge içinde açıklama göstergeleri ile sorunlar bol olacak. Eğer tırnak kaçtı edilebilir olduğunu hatırlamak zorunda çünkü onları görmezden dizeleri ayrıştırma ya, bu kadar basit değildir. Gibi:

<?php
$foo = ' /* // None of these start a comment ';
$bar = ' \' // Remember escaped quotes ';
$orz = " ' \" \' /* // Still not a comment ";
?>

Sipariş Ayrıştırma aynı zamanda baş ağrısı neden olur. Sen sadece basit Önce bir satır yorum veya çoklu hat yorum ya ayrıştırmak için seçemezsiniz. Her ikisi de (onlar belgede görünür sırayla yani) aynı zamanda çözümlenir. Aksi takdirde kırık kod ile sona erebilir. Bana açıklayalım:

<?php
/* // Multiline comment */
// /* Single Line comment
$omg = 'This is not in a comment */';
?>

Eğer ilk çok satır yorumlarınızı ayrıştırmak varsa, * / ikinci kodu yok dize kısmını yiyip olacaktır. Ilk tek satır yorum ayrıştırmak, ayrıca kod yok edecek olan, * / ilk yemek sona erecek.

Gördüğünüz gibi, düzenli ifade ile sorunu çözmek niyetinde olmadığını, hesaba olurdu çok karmaşık senaryolar vardır. Tek doğru çözüm tüm kaynak kodu bütünüyle ve açıklama belirteçleri şerit ve dosyayı yeniden inşa etmek, token_get_all() gibi, PHP'nin çeşit kullanmaktır. Korkarım ki, ya tamamen basit değildir. HTML dokunulmaz çünkü aynı zamanda, HTML yorumlarla yardımcı olmayacaktır. HTML nadiren de PHP ile oluşturulmuştur çünkü ya HTML yorumlarını almak için XML ayrıştırıcılarını kullanamazsınız.

Kısa koymak için, ne yaptığınızı fikri basit, ama fiili uygulama görünüyor çok daha zordur. Bunu yapmak için çok iyi bir nedeniniz olmadıkça Böylece, ben, bunu önlemek için çalışıyorum tavsiye ederim.

Regex Bunu yapmanın bir yolu, bir bileşik ifade ve preg_replace_callback kullanmaktır.

Ben kötü bir örnek göndermek için gidiyordu ama bakmak için en iyi yer Dean Edwards 'JS paketleyicisi script PHP noktasına kaynak kodu - Eğer genel bir fikir görmelisiniz.

http://joliclic.free.fr/php/javascript-packer/en/