webForumDet fria alternativet

Hitta <script ...><!-- ... --></script>

2 svar · 577 visningar · startad av echoSwe

echoSweMedlem sedan nov. 20041 189 inlägg
#1

Tja,

Har ett regex (C#):
(<script[^<]*>){1}(?(?=\s*<!--)(\s*<!--)(\s*.*?)(//\s*-->)|(\s*.*?))\s*(</script>){1}

Det är som ni ser indelat i 6 grupper, index 0 till och med 5, genom paranteserna.

Den letar efter följande typ av kod:

<script type="text/javascript">
<!--
document.write(...);
-->
</script>

För att sedan ersätta

<!--

det med

<[CDATA[

och

-->

med

]]>

.

Det fungerar bra, men inte om man redan har skrivit

<script type="text/javascript">
<[CDATA[
$('hej').ToUppercase();
]]>
</script>

För att ta ett exempel. Så jag testade med följande regex:
(<script[^<]*>){1}(?(?=\s*<!--?!\s*<\[CDATA\[)(\s*<!--)(\s*.*?)(//\s*-->)|(\s*.*?))\s*(</script>){1}

Vilket dock fortfarande matchar och därmed dubblerar cdata-beteckningarna. Jag vill alltså att den ska matcha html-kommentarer inom scripttaggar, men inte CDATA-beteckningar i scripttaggar.

Peter SMedlem sedan dec. 20025 483 inlägg
#2

Tjena!

Vad tror du om

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

Ersättningsmönstret skulle kunna vara

// $1 = <script...>, $2 = <allt utom kommentarerna>, $3 = </script>
$1<[CDATA[$2]]>$3
echoSweMedlem sedan nov. 20041 189 inlägg
#3

Det tror jag blir jättebra :) Tack!

123 ms totalt · 3 externa anrop · v20260731065814-full.30151723
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
120 ms — hämta tråd, inlägg och bilagor (db)