Autor | Zpráva | ||
---|---|---|---|
Timy Profil |
#1 · Zasláno: 2. 2. 2009, 13:06:13
Mám kus HTML kódu a potřeboval bych z něj odstranit všechen Javascript. Element <script> už jsem vyfiltroval, teď je na řadě odfiltrování různých onclicků apod. Mám prozatím tento regulár:
preg_replace("/<(.*)(onclick|onmouseover)( *)=( *)(\"|')(.*)\\5(.*)>/Usi", "<$1$7>", $html); Toto v zásadě funguje dobře, akorát to vždy odebere pouze jeden atribut, první, na který narazí. Potřeboval bych nějaký modifikátor, který by mi zaručil, že dokud v přepisovaném řetězci je podřetězec odpovídající reguláru, tak bude přepisovat dále. Existuje něco takového? Nedohledal jsem se. |
||
SwimX Profil |
#2 · Zasláno: 2. 2. 2009, 13:17:15 · Upravil/a: SwimX
Timy
a co dát celý ten výraz libovolněkrát opakovat? $a = preg_replace("/<(.*)((onclick|onmouseover)( *)=( *)(\"|')(.*)\\5(.*))*>/Usi", "<$1$7>", $htl); //edit: místo hvězdičky spíš plus asi |
||
Chamurappi Profil |
#3 · Zasláno: 2. 2. 2009, 13:22:23
Reaguji na Timyho:
Kolem hodnoty atributu nemusí být uvozovky, s tím tvůj výraz asi moc nepočítá. Kdybys potřeboval jen zničit funkčnost skriptů bez ohledu na čistotu výsledného kódu, můžeš nahradit všechny „([^\w])on(\w+)“ za „$1on$2“. Na všech obsahových místech totiž prohlížeč entitu interpretuje, v názvech atributů nikdy. |
||
Timy Profil |
#4 · Zasláno: 2. 2. 2009, 13:30:50
SwimX
ee, to už jsem zkoušel, sežere to i to, co nemá: <p onclick="asdasd" title="asd" onmouseover="asd"> vrátí <p > Chamurappi „Kolem hodnoty atributu nemusí být uvozovky, s tím tvůj výraz asi moc nepočítá. “ Vím :-). Řeším věci postupně, na to taky dojde řada. „Kdybys potřeboval jen zničit funkčnost skriptů bez ohledu na čistotu výsledného kódu, můžeš nahradit všechny „([^\w])on(\w+)“ za „$1on$2“. Na všech obsahových místech totiž prohlížeč entitu interpretuje, v názvech atributů nikdy.“ Hodilo by se mi spíš úplně odstranění, ale díky, přinejhorším to použiji. |
||
SwimX Profil |
#5 · Zasláno: 2. 2. 2009, 13:31:48 · Upravil/a: SwimX
Chamurappi
„Kolem hodnoty atributu nemusí být uvozovky, s tím tvůj výraz asi moc nepočítá.“ $a = preg_replace("/<(.*)((on[a-zA-Z]+)( *)=( *)(\"|')?(.*)\\5(.*))+>/Usi", "<$1$7>", $htl); už jo. a pořád mi to přijde lepší než si zničit kód stránky entitama. ale dobrý nápad je nahradit všechny atributy začínající na on. nebo nějkaký jiný než JS může začínat na on? edit: Timy to sem nezkoušel, tak to nic :( |
||
SwimX Profil |
#6 · Zasláno: 2. 2. 2009, 13:59:18 · Upravil/a: SwimX
splodil jsem todle. Funguje mi to, zkus to ty.
preg_replace("#[^\S]on[a-zA-Z]+=(\"|')?[\S]+(\"|')?#is", "", $html); edit: trošlu chyba na kráse: v tom JS nesmí být mezery :)) nebo takhle: preg_replace("#[^\S]on[a-zA-Z]+=(\"|')?([^\"']+)(\"|')?#is", "", $htl); ale zase v JS nesmí být " ' takže onlick="window.open('moje okno');" -> to sice znefunkční, ale zm*ví |
||
Timy Profil |
#7 · Zasláno: 2. 2. 2009, 14:17:16
SwimX
Jojo, mezery. Pak mi to špatně převádí značku, pokud je nějaký on-atribut na posledním místě: <p onclick="js"> => <p Ještě tam chybí mezery kolem rovnítka (jsou přípustné): #([^\S])on[a-zA-Z]+( *)=( *)(\"|')?([\S]+)(\"|')?#is A pak nejpodstatnější věc — odstraňuje to i mimo HTML značky :-). <p onclick="js" onlick="js" class="trida"> onclick="js" onlick="js" class="trida" => <p class="trida"> class="trida" |
||
SwimX Profil |
#8 · Zasláno: 2. 2. 2009, 14:32:21
Timy
poslední výkřik :) preg_replace("# on[a-zA-Z]+( *)=( *)((\"[^\">]+\")|('[^'>]+')|([^\s>]+))#is", "", $htl); todle odstranuje mezi " text kterej je neobsahuje " mezi 'taky' a pokud nejsou uvozovky ani apostrofy, tak text ve kterym neni mezera, nebo snad lze onclick=neco neco ? mezery kolem rovnítka jsem zapomněl, zde jsou, zančka na posledním místě vyřešena (teda za podmínky, že uvnitř toho JS nebude > což ale snad nejde) no a mimo tagy to bohužel nahrazuje, ale vadí to? |
||
Timy Profil |
#9 · Zasláno: 2. 2. 2009, 14:39:38 · Upravil/a: Timy
SwimX
„no a mimo tagy to bohužel nahrazuje, ale vadí to?“ Bohužel ano :-(. Ale i tak díky :-). „teda za podmínky, že uvnitř toho JS nebude > což ale snad nejde“ Tohle v prohlížečích projde (má tam být jen >, systém to převádí na entitu): <span onclick="alert('5 > 3')">text</span> |
||
bitbit Profil |
#10 · Zasláno: 3. 2. 2009, 12:50:34 · Upravil/a: bitbit
SwimX: a co to projet 2x?
$a = preg_replace("# on[a-zA-Z]+((=(\")(.[^\"_]*)(\" ))|(=(\')(.[^\'_]*)(\' )))#is", " ", $htl); $b = preg_replace("# on[a-zA-Z]+((=(\")(.[^\"_]*)(\">))|(=(\')(.[^\'_]*)(\'>)))#is", ">", $a); takhle uz by to asi mohlo byt i jednou: $a = preg_replace("# on[a-zA-Z]+((=(\")(.[^\"_]*)(\"))|(=(\')(.[^\'_]*)(\')))#is", "", $htl); Všechny uvedené příklady javascriptu to vymaže a nechá to co ma, tak uvidíme, zda narazíte ještě na něco jiného. |
||
Časová prodleva: 15 let
|
0