[Regexp/PHP] Matchen van omliggende html-tags

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • BKJ
  • Registratie: April 2000
  • Laatst online: 18-09 14:52
Voor een analyse van input van gebruikers wil ik graag kijken naar de tags die om een bepaalde string heen liggen.

Voorbeeld:

code:
1
En <b>deze</b> niet matchen <a href="http://www.testurl.nl/test"><b>dit wel</b></a> en dit ook niet


Bij het opgeven van "dit wel" moet de regexp terugkomen met:
code:
1
<a href="http://www.testurl.nl/test"><b>
en
code:
1
</b></a>
.

Dit is wat ik nu heb qua code:

PHP:
1
2
3
4
5
6
7
8
9
10
11
<?


$test_string = 'En <b>deze</b> niet matchen <a href="http://www.testurl.nl/test"><b>dit wel</b></a> en dit ook niet';
$string = "dit wel";

preg_match_all('/(<.*?>)'.$string.'(<\/.*?>)/',$test_string,$matches);

print_r($matches);

?>


Met als output:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Array
(
    [0] => Array
        (
            [0] => <b>deze</b> niet matchen <a href="http://www.testurl.nl/test"><b>dit wel</b>
        )

    [1] => Array
        (
            [0] => <b>deze</b> niet matchen <a href="http://www.testurl.nl/test"><b>
        )

    [2] => Array
        (
            [0] => </b>
        )

)


Zoals je kan zien is de match ervoor te rigoreus en de match erna te klein. Heb me inmiddels verdiept in positive lookbacks etc maar ik kom er niet uit.

Kamer huren


Acties:
  • 0 Henk 'm!

  • Gonadan
  • Registratie: Februari 2004
  • Laatst online: 21:31

Gonadan

Admin Beeld & Geluid, Harde Waren
Beter lezen. :+

[ Voor 88% gewijzigd door Gonadan op 31-03-2008 09:19 ]

Look for the signal in your life, not the noise.

Canon R6 | 50 f/1.8 STM | 430EX II
Sigma 85 f/1.4 Art | 100-400 Contemporary
Zeiss Distagon 21 f/2.8


Acties:
  • 0 Henk 'm!

  • eamelink
  • Registratie: Juni 2001
  • Niet online

eamelink

Droptikkels

Je kan in ieder geval de ungreedy modifier (u) gebruiken om die te grote eerste match te fixen. Om dan de volgende set tags erbij te pakken zul je je tag-gedeelte in je regexp moeten voorzien van een +, want anders match hij er uiteraard maar één :)

Acties:
  • 0 Henk 'm!

  • BKJ
  • Registratie: April 2000
  • Laatst online: 18-09 14:52
eamelink schreef op maandag 31 maart 2008 @ 09:29:
Je kan in ieder geval de ungreedy modifier (u) gebruiken om die te grote eerste match te fixen. Om dan de volgende set tags erbij te pakken zul je je tag-gedeelte in je regexp moeten voorzien van een +, want anders match hij er uiteraard maar één :)
Dit:

PHP:
1
preg_match_all('/(<.*?>)'.$string.'(<\/.*?>)/U',$test_string,$matches);


fixed de achterste match erg mooi. Maar vooraan blijft de match te ruim. Kwam er trouwens achter dat 'U' de juiste modifier is en niet 'u'.

Edit

Dit werkt dan weer niet voor de achterste match:

code:
1
En <b>deze</b> niet matchen <a href="http://www.testurl.nl/test"><b>dit wel</b></a> en </a> dit ook niet


Resultaat achterste match: </b></a> en </a>

[ Voor 16% gewijzigd door BKJ op 31-03-2008 09:39 ]

Kamer huren


Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Dan verander je de wildcard match naar 'alles behalve >' en vervolgens gebruik je alsnog een + achter dat stukje.

{signature}


Acties:
  • 0 Henk 'm!

  • BKJ
  • Registratie: April 2000
  • Laatst online: 18-09 14:52
Ook deze simpele gedachtegang werkt niet:

code:
1
/(<.*?>){1,3}$string(<.*?>){1,3}/


De match ervoor is nu alles.

Kamer huren


Acties:
  • 0 Henk 'm!

  • pedorus
  • Registratie: Januari 2008
  • Niet online
Het grappige is nu dat het antwoord van Voutloos voor de vraag staat.

HTML 100% goed matchen met regexps gaat trouwens nooit lukken, maar voor een simpele analyse maakt dat weinig uit.

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


Acties:
  • 0 Henk 'm!

  • SchizoDuckie
  • Registratie: April 2001
  • Laatst online: 18-02 23:12

SchizoDuckie

Kwaak

*zucht gaan we weer* :P

Gebruik GEEN regexps om HTML te parsen!!!!!!111oneeoneone


HTML Parsen doe je met de DOMDocument::loadHTML

http://nl2.php.net/manual...-domdocument-loadhtml.php

(dan kan je er gewoon netjes xpath queries op los laten namelijk)

[ Voor 36% gewijzigd door SchizoDuckie op 31-03-2008 17:15 ]

Stop uploading passwords to Github!

Pagina: 1