php preg_replace vraag icm regex

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • evaarties
  • Registratie: April 2001
  • Laatst online: 27-05 16:41

evaarties

Powerball @ 12.582

Topicstarter
Ik ben bezig met het opschonen van een htmlpagina met embedded scripts en stylesheet.

Daarvoor gebruik ik php en preg_replace icm reguliere expressies.

Nu heb ik voor elkaar wat ik wil bereiken met de volgende code:

PHP:
1
2
$website_contents = preg_replace("@<style[^>]*?>.*?</style>@si", "", $website_contents);
$website_contents = preg_replace("@<script[^>]*?>.*?</script>@si", "", $website_contents);


Deze code komt echter rechtstreeks uit een voorbeeld van php.net en ik snap de expressie niet helemaal.

Ik kan

code:
1
@<style[^>]*?>.*?</style>@si


opbreken in de volgende stukken, waarbij ik heb aangeven wat ik denk wat elke stuk doet.:

@ ??
<style Begin aangeven van de stijl, in de code dus <style
[^>]*? De volgende karakters mogen geen > zijn, in de code dus <style .......
> Er moet een > aanwezig zijn, in de code <style .......>
.*? Elk karakter mag aanwezig zijn, ongelimiteerd aantal, in de code <style .......>.....
</style> Er moet een </style> aanwezig zijn, in de code <style .......>.....</style>
@ ??
si ??


Zoals je ziet heb ik een aantal stukken met vraagtekens, waar dienen die voor? Want als ik ze weghaal werkt de preg_replace niet meer. (En heb ik de overige stukken eigenlijk goed begrepen?)

Specs | Site | The Lemmings Encyclopedia | Ubuntu Edge smartphone nog tot 20 augustus te koop!!


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Hier al gekeken?
i (PCRE_CASELESS)
If this modifier is set, letters in the pattern match both upper and lower case letters.

s (PCRE_DOTALL)
If this modifier is set, a dot metacharacter in the pattern matches all characters, including newlines. Without it, newlines are excluded. This modifier is equivalent to Perl's /s modifier. A negative class such as [^a] always matches a newline character, independent of the setting of this modifier.

[ Voor 77% gewijzigd door RobIII op 01-11-2006 15:56 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • evaarties
  • Registratie: April 2001
  • Laatst online: 27-05 16:41

evaarties

Powerball @ 12.582

Topicstarter
Daar heb ik inderdaad al gekeken, evenals hier: http://www.regular-expressions.info/.

Met de informatie die daar staat heb ik uitgevonden wat de stukken doen die ik al heb beschreven, ik blijf steken bij de 3 met ??.

Er wordt bijvoorbeeld nergens gesproken over een @.

Specs | Site | The Lemmings Encyclopedia | Ubuntu Edge smartphone nog tot 20 augustus te koop!!


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
evaarties schreef op woensdag 01 november 2006 @ 15:51:
Daar heb ik inderdaad al gekeken, evenals hier: http://www.regular-expressions.info/.

Met de informatie die daar staat heb ik uitgevonden wat de stukken doen die ik al heb beschreven, ik blijf steken bij de 3 met ??.

Er wordt bijvoorbeeld nergens gesproken over een @.
De i en s modifiers zijn gewoon letterlijk gequote in mijn vorige post. De @ is gewoon een escape voor / als ik me niet vergis.

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • Mr. Bondt
  • Registratie: Februari 2005
  • Laatst online: 10-06 10:11
code:
1
@<style[^>]*?>.*?</style>@si

Doet hetzelfde als
code:
1
/<style[^>]*?>.*?<\/style>/si

Alle / moet nu ge-escaped worden natuurlijk ;)
Of
code:
1
{<style[^>]*?>.*?</style>}si


Dat zijn delimiters, alles wat ertussen staat is de regex.
Wat erachter staat, zijn de modifiers, die passen de werking van de regex aan.

[ Voor 26% gewijzigd door Mr. Bondt op 01-11-2006 15:59 ]


Acties:
  • 0 Henk 'm!

  • evaarties
  • Registratie: April 2001
  • Laatst online: 27-05 16:41

evaarties

Powerball @ 12.582

Topicstarter
Dat maakt het een hoop duidelijker, wel vreemd dat ik nergens iets kan vinden over de @ als gebruik voor \\.

Specs | Site | The Lemmings Encyclopedia | Ubuntu Edge smartphone nog tot 20 augustus te koop!!


Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 23:03

Janoz

Moderator Devschuur®

!litemod

RobIII schreef op woensdag 01 november 2006 @ 15:55:
[...]

De i en s modifiers zijn gewoon letterlijk gequote in mijn vorige post. De @ is gewoon een escape voor / als ik me niet vergis.
Het eerste karakter is de delimiter. Het is een scheidingsteken dus. Het maakt in principe niet uit welk teken je hiervoor gebruikt. Vaak wordt hiervoor gewoon de / gebruikt, maar aangezien deze ook in de regexp voorkomt wordt hiervoor een andere gebruikt.


De vraagtekens geven trouwens greedyness aan bij de .*. Zonder ? zou hij zoveel mogelijk proberen te matchen terwijl je juist wil dat hij zo weinig mogelijk matcht. Of het in dit geval uitmaakt vraag ik me trouwens af.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Janoz schreef op woensdag 01 november 2006 @ 16:18:
[...]

Het eerste karakter is de delimiter. Het is een scheidingsteken dus. Het maakt in principe niet uit welk teken je hiervoor gebruikt. Vaak wordt hiervoor gewoon de / gebruikt, maar aangezien deze ook in de regexp voorkomt wordt hiervoor een andere gebruikt.
Dat zeg ik :X een beetje knullig

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • EdwinG
  • Registratie: Oktober 2002
  • Laatst online: 10-06 15:46
Janoz schreef op woensdag 01 november 2006 @ 16:18:De vraagtekens geven trouwens greedyness aan bij de .*. Zonder ? zou hij zoveel mogelijk proberen te matchen terwijl je juist wil dat hij zo weinig mogelijk matcht. Of het in dit geval uitmaakt vraag ik me trouwens af.
Zonder de ? kunnen volgens mij problemen ontstaan als je zowel in de head, als in de body een <script> blok hebt staan, omdat dan de eerste keer het begin van scriptblok 1, en het einde van scriptblok 2 oppakt, en dus onder andere </head> en <body> weghaald.

Invoer
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<html>
<head>
<title>testje</title>
  <script type="text/javascript">
    blablabla
  </script>
</head>
<body>
  <script>
    bla bla bla 2
  </script>
hoi
</body>
</html>


Met ?
code:
1
2
3
4
5
6
7
8
<html>
<head>
<title>testje</title>
</head>
<body>
hoi
</body>
</html>


Zonder ?
code:
1
2
3
4
5
6
<html>
<head>
<title>testje</title>
hoi
</body>
</html>

[ Voor 26% gewijzigd door EdwinG op 01-11-2006 17:19 ]

Bezoek eens een willekeurige pagina


Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 23:03

Janoz

Moderator Devschuur®

!litemod

Dat klopt. Het tweede vraagteken is zeker nodig om ervoor te zorgen dat hij niet enkel de eerste open en de laatste sluiten tag matched. Het eerste vraagteken daarintegen lijkt me wat overbodig. Daar gaat het om alles behalve een > gevolgd door een >. Er is dan geen verschil tussen greedy en ungreedy.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'

Pagina: 1