Autor Zpráva
Timy
Profil
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
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
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 „$1o&#110;$2“. Na všech obsahových místech totiž prohlížeč entitu interpretuje, v názvech atributů nikdy.
Timy
Profil
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
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
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
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
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
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
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.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: