Programim dhe zhvillim, javascript, python, php, html

Heqja e komenteve HTML me PHP por duke lënë kushte

Aktualisht jam duke përdorur PHP dhe një shprehje të rregullt për të hequr të gjitha komentet HTML nga një faqe. Skenari funksionon mirë... pak shumë mirë. Ai heq të gjitha komentet duke përfshirë komentet e mia të kushtëzuara në . Ja çfarë kam:

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

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

Meqenëse regeksi im nuk është shumë i nxehtë, po e kam problem të përpiqem të kuptoj se si të modifikoj modelin për të përjashtuar komentet e kushtëzuara si p.sh.

<!--[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]-->

Gëzuar


Përgjigjet:


1

Meqenëse komentet nuk mund të futen në HTML, një regex mund ta bëjë punën, në teori. Megjithatë, përdorimi i një lloj analizuesi do të ishte zgjidhja më e mirë, veçanërisht nëse kontributi juaj nuk është i garantuar të jetë i mirëformuar.

Këtu është përpjekja ime për të. Për t'iu përshtatur vetëm komenteve normale, kjo do të funksiononte. Është bërë një përbindësh, më vjen keq për këtë. E kam testuar shumë, duket se e bën mirë, por nuk jap garanci.

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

Shpjegim:

<!--                #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: "-->"

Hapat #02 dhe #11 janë vendimtare. #02 sigurohet që karakteret e mëposhtme të mos tregojnë një koment të kushtëzuar. Pas kësaj, #11 sigurohet që karakteret e mëposhtme të mos tregojnë fundin e komentit, ndërsa #12 dhe #13 shkaktojnë përputhjen aktuale.

Aplikoni me flamuj "global" dhe "dotall".

Për të bërë të kundërtën (përputhen vetëm me komentet e kushtëzuara), do të ishte diçka si kjo:

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

Shpjegim:

<!                  #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)

Përsëri, aplikoni me flamuj "global" dhe "dotall".

Hapi #02 është për shkak të sintaksës "zbuluar nga niveli i poshtëm", ​​shikoni: "MSDN - Rreth komenteve të kushtëzuara".

Nuk jam plotësisht i sigurt se ku lejohen apo priten hapësirat. Shto \s* në shprehje aty ku është e përshtatshme.

18.06.2009
  • Përshëndetje Tomalak, faleminderit për kontributin tuaj dhe shpjegimet e hollësishme. E bën regex shumë më të lehtë :). Megjithatë, sapo kam provuar zgjidhjen tuaj dhe nuk shfaq asgjë, përveç një faqeje të zbrazët. Rreshti i plotë që po përdor është: return preg_replace('‹!--(?!\s*(?:[if [^]]+]|‹!|›))(?:(?!--› ).)*--›', '', $buffer); A është kjo e saktë? 19.06.2009
  • Më duhet të pranoj se nuk kam hasur në preg_replace më parë, kështu që unë duhet t'i lexoj dokumentet sapo të kem mundësi. Megjithatë, për qëllimin e këtij problemi të veçantë, a është e mundur që ju të elaboroni pak se si ta zbatoni atë? Edhe pse duket më e gjerë se regex, tingëllon si një qasje interesante që do të doja ta provoja. 22.06.2009
  • Ju keni një 'shans' për të lexuar dokumentet tani: php.net/manual /en/function.preg-replace.php :)) (gjithashtu: php.net/manual/en/pcre.pattern.php ) 12.04.2010
  • Provova shumë regexs të tjerë, por ky ishte i fundit dhe funksionoi siç doja. 28.03.2013


  • 3

    Në përmbledhje, kjo duket të jetë zgjidhja më e mirë:

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

    Ai heq të gjitha komentet dhe lë të kushtëzuara me përjashtim të atij kryesor:

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

    ku shtesë duket se po e shkakton problemin.

    Nëse dikush mund të sugjerojë regex-in i cili do ta merrte këtë parasysh dhe do ta linte atë kusht gjithashtu në vend, atëherë do të ishte perfekte.

    Zgjidhja e Tomalak duket e mirë, por si fillestar dhe pa udhëzime të mëtejshme nuk e di se si ta zbatoj atë edhe pse do të doja ta provoja nëse dikush mund të shtjellojë se si ta zbatoj?

    Faleminderit

    23.06.2009

    4

    Nuk jam i sigurt nëse motori regex i PHP do të pëlqejë sa vijon, por provoni këtë model:

    '/<!--(.|\s)*(\[if .*\]){0}(.|\s)*?-->/'
    
    18.06.2009
  • Zëvendësimi i regex-it tim me këtë kërkon një dritare pop-up të ruajtjes së shkarkimit të faqes index.php në vend që ta përshkruajë atë. 18.06.2009

  • 5

    Diçka si kjo mund të funksionojë:

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

    Është njësoj si e juaja, përveç që injoron komentet kanë një kllapë hapëse menjëherë pas etiketës së fillimit të komentit.

    18.06.2009
  • Përshëndetje Boden. Kjo metodë heq komentin, por lë ‹› që do të thotë se fletët e stilit nuk aplikohen dhe dokumenti është i mbushur me shigjeta. 18.06.2009
  • A e quani kështu? (nuk jam i sigurt nëse ky kod do të postohet në një koment) preg_replace('/‹!--[^[](.|\s)*?--›/', '', $buffer); 18.06.2009
  • Po, e gjithë rreshti: return preg_replace('/‹!--[^[](.|\s)*?--›/', '', $buffer); Kjo tani nuk del nga kllapat, por nuk lë me sukses as komentet e kushtëzuara: ‹!--[if !IE]› ‹!--[nëse IE 7]› ‹link rel=stylesheet href=/templates/css /ie7.css type=text/css media=ekran /› ‹![endif]› ‹!--[if IE 6]› ‹link rel=stylesheet href=/templates/css/ie6.css type=text/css media=ekran /› ‹![endif]--› ‹lidhja rel=typi i fletës së stilit=tekst/css media=print href=/templates/css/print.css /› 18.06.2009
  • Hmm... po e ekzekutoj këtu: solmetra.com/scripts/regex/index .php duke përdorur opsionin preg_replace dhe unë preva dhe ngjita fragmentin e kodit tuaj: ai i lë të kushtëzuarat atje. 18.06.2009
  • Tingëllon vërtet e çuditshme. Sapo kam kopjuar dhe ngjitur kodin tuaj dhe e kam provuar përsëri, por e njëjta gjë po ndodh ende. Komentet e mia të kushtëzuara janë saktësisht siç janë në pyetjen time origjinale, por ende mbeten si komenti im më lart. 19.06.2009
  • Kam vënë re se duket se është vetëm komenti i parë i kushtëzuar që shkakton problemin. Ky është stiluar paksa ndryshe nga të tjerët me shtimin e ‹!--› në rreshtin e parë. Kjo është për t'u shërbyer shfletuesve të tjerë përveç IE (shih:simplebits.com/notebook /2009/02/13/iegone.html). Thjesht duket se ka nevojë për një javë të vogël për t'u kujdesur për këtë, atëherë do të jetë një përshtatje e përsosur. 19.06.2009
  • Materiale të reja

    Masterclass Coroutines: Kapitulli-3: Anulimi i korutinave dhe trajtimi i përjashtimeve.
    Mirë se vini në udhëzuesin gjithëpërfshirës mbi Kotlin Coroutines! Në këtë seri artikujsh, unë do t'ju çoj në një udhëtim magjepsës, duke filluar nga bazat dhe gradualisht duke u thelluar në..

    Faketojeni derisa ta arrini me të dhënat false
    A e gjeni ndonjëherë veten duke ndërtuar një aplikacion të ri dhe keni nevojë për të dhëna testimi që duken dhe duken më realiste ose një grup i madh të dhënash për performancën e ngarkesës...

    Si të përdorni kërkesën API në Python
    Kërkesë API në GitHub për të marrë depot e përdoruesve duke përdorur Python. Në këtë artikull, unë shpjegoj procesin hap pas hapi për të trajtuar një kërkesë API për të marrë të dhëna nga..

    Një udhëzues hap pas hapi për të zotëruar React
    Në këtë artikull, do të mësoni se si të krijoni aplikacionin React, do të mësoni se si funksionon React dhe konceptet thelbësore që duhet të dini për të ndërtuar aplikacione React. Learning..

    AI dhe Psikologjia — Pjesa 2
    Në pjesën 2 të serisë sonë të AI dhe Psikologji ne diskutojmë se si makineritë mbledhin dhe përpunojnë të dhëna për të mësuar emocione dhe ndjenja të ndryshme në mendjen e njeriut, duke ndihmuar..

    Esencialet e punës ditore të kodit tim VS
    Shtesat e mia të preferuara - Git Graph 💹 Kjo shtesë është vërtet e mahnitshme, e përdor përpara se të filloj të punoj për të kontrolluar dy herë ndryshimet dhe degët më të fundit, mund të..

    Pse Python? Zbulimi i fuqisë së gjithanshme të një gjiganti programues
    Në peizazhin gjithnjë në zhvillim të gjuhëve të programimit, Python është shfaqur si një forcë dominuese. Rritja e tij meteorike nuk është rastësi. Joshja e Python qëndron në thjeshtësinë,..