PHP ile HTML Yorumlar sıyırma Ama Koşullamalar Leaving

5 Cevap php

Ben şu anda bir sayfadan tüm HTML yorumlarını dışarı atmak için PHP ve normal bir ifade kullanıyorum. Script iyi çalışıyor ... biraz çok iyi. Bu benim koşullu yorumlar dahil tüm yorumları şeritler. İşte bende ne:

<?php
  function callback($buffer)
  {
        return preg_replace('/<!--(.|\s)*?-->/', '', $buffer);
  }

  ob_start("callback");
?>
... HTML source goes here ...
<?php ob_end_flush(); ?>

Benim regex çok sıcak olmadığı için ben gibi Şartlı yorumlarınızı dışlamak için desen değiştirmek için nasıl anlamaya çalışıyor sorun yaşıyorum:

<!--[if !IE]><!-->
<link rel="stylesheet" href="/css/screen.css" type="text/css" media="screen" />
<!-- <![endif]-->

<!--[if IE 7]>
<link rel="stylesheet" href="/css/ie7.css" type="text/css" media="screen" />
<![endif]-->

<!--[if IE 6]>
<link rel="stylesheet" href="/css/ie6.css" type="text/css" media="screen" />
<![endif]-->

Şerefe

5 Cevap

Comments HTML iç içe olamaz yana, bir regex teoride, iş yapabilirsiniz. Yine de, çözümleyici bir çeşit kullanarak giriş iyi biçimlendirilmiş olması garanti değil, özellikle eğer, daha iyi bir seçim olacaktır.

İşte bu benim girişimi olduğunu. Yalnızca normal yorumlarınızı maç için, bu işe olur. Bunun için üzgünüm oldukça canavar haline gelmiştir. Ben oldukça kapsamlı şekilde test ettik, iyi yapmak gibi görünüyor, ama ben hiçbir garanti vermez.

<!--(?!\s*(?:\[if [^\]]+]|<!|>))(?:(?!-->).)*-->

Açıklama:

<!--                #01: "<!--"
(?!                 #02: look-ahead: a position not followed by:
  \s*               #03:   any number of space
  (?:               #04:   non-capturing group, any of:
    \[if [^\]]+]    #05:     "[if ...]"
    |<!             #06:     or "<!"
    |>              #07:     or ">"
  )                 #08:   end non-capturing group
)                   #09: end look-ahead
(?:                 #10: non-capturing group:
  (?!-->)           #11:   a position not followed by "-->"
  .                 #12:   eat the following char, it's part of the comment
)*                  #13: end non-capturing group, repeat
-->                 #14: "-->"

Adımlar # 02 ve # 11. önemlidir. # 02 şu karakterleri bir koşullu yorum belirtmek yok olmasını sağlar. Bundan sonra, # 11 ise # 12 ve 13 gerçek eşleştirme nedeni, aşağıdaki karakterler yorumun sonunu işaret olmadığından emin kılar.

"Küresel" ve "dotall" bayrakları ile uygulayın.

Tersini (sadece koşullu yorum eşleştirmek) yapmak için, bu gibi bir şey olurdu:

<!(--)?(?=\[)(?:(?!<!\[endif\]\1>).)*<!\[endif\]\1>

Açıklama:

<!                  #01: "<!"
(--)?               #02: two dashes, optional
(?=\[)              #03: a position followed by "["
(?:                 #04: non-capturing group:
  (?!               #05:   a position not followed by
    <!\[endif\]\1>  #06:     "<![endif]>" or "<![endif]-->" (depends on #02)
  )                 #07:   end of look-ahead
  .                 #08:   eat the following char, it's part of the comment
)*                  #09: end of non-capturing group, repeat
<!\[endif\]\1>      #10: "<![endif]>" or "<![endif]-->" (depends on #02)

Yine, "küresel" ve "dotall" bayrakları ile geçerlidir.

Adım "#02" Çünkü "alt düzey-ortaya" sözdizimi, bakınız: "MSDN - About Conditional Comments".

Alanlarda izin verilen veya beklenen yerlerde tamamen emin değil. Uygun olan her yerde ifade "\s*" ekleyin.

Özetle bu en iyi çözüm gibi görünüyor:

<?php
  function callback($buffer) {
    return preg_replace('/<!--[^\[](.|\s)*?-->/', '', $buffer);
  }
  ob_start("callback");
?>
... HTML source goes here ...
<?php ob_end_flush(); ?>

Tüm yorumlar dışarı şeritler ve üst biri hariç conditionals bırakır:

<!--[if !IE]><!-->
<link rel="stylesheet" href="/css/screen.css" type="text/css" media="screen" />
<!-- <![endif]-->

ek soruna neden gibi görünüyor nerede.

Herkes bu hesaba ve çok yerinde olduğunu condtional bırakacaktı regex önerebilirsiniz eğer o mükemmel olurdu.

Tomalak çözümü iyi görünüyor ama herkes bunu uygulamak nasıl ayrıntılı eğer bunu denemek istiyorum, ancak bir acemi ve başka kurallar olarak bunu uygulamak için nasıl bilmiyorum?

Teşekkürler

PHP'nin regex motoru aşağıdaki gibi, ama bu desen çalışacağız eğer ben emin değilim:

'/<!--(.|\s)*(\[if .*\]){0}(.|\s)*?-->/'

Böyle bir şey işe yarayabilir:

/<!--[^\[](.|\s)*?-->/

Bu hemen comment başlangıç ​​etiketi aşağıdaki yorumlar açılış dirseğini var gözardı etmesi dışında, sizinki gibi aynı.