[PHP/regex] Greedy en preg_replace probs

Pagina: 1
Acties:

  • Steven
  • Registratie: December 2000
  • Laatst online: 14-09 10:15
Ik had geprobeerd om het zonder GoT hulp te doen (er zijn al zoveel regex topics...) maar dit snap ik toch niet helemaal... Ik heb al heel wat topics over dit onderwerp gelezen, maar ik kom er echt niet uit.

OK het probleem; ik heb het volgende stukje HTML:
PHP:
1
2
3
4
5
6
7
8
<?
</HEAD>
<BODY LINK="#0000ff" VLINK="#800080">
<B><FONT SIZE=6><P>dit wil ik hebben</P>
<P>DATUM:donderdag 6-9-2001 </P>
</FONT><FONT SIZE=4><P>AFWEZIG: GIJS</P>
</B></FONT><P>BIJZONDERHEDEN:3c: projectdag (BUT, MOS)</P>
?>

Nu wil ik het stukje [b]dit wil ik hebben[/b] er uit halen. Ik zat eerst te kutten met ereg_replace maar daarmee kon je niet greedy gaan, wat hiervoor nodig is. Uiteindelijk kwam ik op de volgende twee oplossingen, maar beide voldoen ze niet :'(
PHP:
1
2
3
4
5
<?
$info = preg_replace("(<B><FONT SIZE=6><P>)(.*?)(</P>)","\\2", $info);
//En ik heb ook geprobeerd:
$info = preg_replace("!(<B><FONT SIZE=6><P>)(.*?)!(</P>)","\\2", $info);
?>

Wat doe ik in hemelsnaam fout?

  • tomato
  • Registratie: November 1999
  • Niet online
Kijk eens naar preg_match() ipv preg_replace()

  • Steven
  • Registratie: December 2000
  • Laatst online: 14-09 10:15
Op vrijdag 07 december 2001 18:38 schreef tomato het volgende:
Kijk eens naar preg_match() ipv preg_replace()
Maar met een match kan je toch alleen als antwoord true of false krijgen? Ik wil juist dat er een string uitkomt.

* Steven heeft het gevoel dat hij wat doms zegt.

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Als het XHTML is kan je dit heel eenvoudig met XPath doen:
code:
1
/html/body/b/font/p/text()

en dan de eerste knoop nemen.
Of direct:
code:
1
/html/body/b/font/p[position() = 1]/text()

(eventueel nog preciezer)

Suggeste:
Er komen erg veel HTML regex vragen die heel makkelijk met XPath kunnen worden opgelost, misschien is het zinvol om een tutorial te maken hoe je XPath gebruikt in PHP en ASP (dus niet over XPath zelf? Of links in de FAQ naar bestaande tutorials? (weet iemand goede?) Misschien ook links naar XPath tutorials?

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


  • Steven
  • Registratie: December 2000
  • Laatst online: 14-09 10:15
Ehh erg bedankt, maar ik wilde wel graag met beide benen op de grond blijven staan en het "gewoon" in PHP op lossen :)

  • Onno
  • Registratie: Juni 1999
  • Niet online
Op zaterdag 08 december 2001 00:24 schreef Steven_NL het volgende:
Maar met een match kan je toch alleen als antwoord true of false krijgen?
Het is tijd om de manual te lezen. :)

  • Steven
  • Registratie: December 2000
  • Laatst online: 14-09 10:15
Op zaterdag 08 december 2001 01:21 schreef Onno het volgende:

[..]

Het is tijd om de manual te lezen. :)
Dat heb ik al tig keer gedaan, en ook een stapel tutorials; maar ze gaan vooral over vallideren en niet over replacen. Geloof me, ik ben hier nu al uren mee bezig. :'(

  • Onno
  • Registratie: Juni 1999
  • Niet online
Op zaterdag 08 december 2001 01:32 schreef Steven_NL het volgende:
Dat heb ik al tig keer gedaan,
Waar haal je dan vandaan dat je alleen een boolean terug kunt krijgen? Dat staat er *echt* niet hoor. :)

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Steven_NL: Ehh erg bedankt, maar ik wilde wel graag met beide benen op de grond blijven staan en het "gewoon" in PHP op lossen :)
Tja, waarom makkelijk doen als het moeilijk kan? :P ;) .

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


  • Steven
  • Registratie: December 2000
  • Laatst online: 14-09 10:15
Op zaterdag 08 december 2001 01:34 schreef Onno het volgende:

[..]

Waar haal je dan vandaan dat je alleen een boolean terug kunt krijgen? Dat staat er *echt* niet hoor. :)
Laat ik het dan anders zeggen; ik snap de manual niet echt...

Update: na NOG meer dingen doorgelezen te hebben heb ik het zo gedaan:
PHP:
1
2
3
4
<?
$temp = preg_replace("!.*<FONT SIZE=6><P>(.*?)</P>!", "<onzin1>\\1<onzin2>", $temp);
$temp = ereg_replace(".*<onzin1>(.*)<onzin2>.*", "\\1", $temp);
?>

Maar om nou te zeggen dat ik dit een mooie oplossing vind...

  • Orphix
  • Registratie: Februari 2000
  • Niet online
met preg_match kan je de gevonden waardes op laten slaan in een array:
PHP:
1
2
3
4
<?
$temp = preg_match("!<FONT SIZE=6><P>(.*?)</P>!", $temp, $matches);
// nu staat je tekst in $matches[1] 
?>
Pagina: 1