[PHP] test uit html filteren

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik ben al de hele avond bezig om uit het volgende html gedeelte 2 teksten te halen.
HTML:
1
2
3
4
5
6
7
<tr>
<td class="ContactListTableCheckboxCol"><input type="checkbox" name="SelectedContacts" value="788ac0de-b951-45c2-8795-8f7219d98a29"  title="Een contactpersoon selecteren" id="788ac0de-b951-45c2-8795-8f7219d98a29" onclick="selectOne();" /></td>
<td>&nbsp;</td>
<td><a href="ContactViewLight.aspx?ContactID=788ac0de-b951-45c2-8795-8f7219d98a29&n=2018015942">#####TEKST1######</a></td>
<td class="NoWrap"><a href="#" onclick="submitToCompose('788ac0de-b951-45c2-8795-8f7219d98a29', 'EditMessageLight.aspx?n=1334871717');">######TEKST2######</a></td>
<td class="NoWrap">&nbsp;</td>
</tr>


Dit stuk html kan per pagina een aantal keer voorkomen.
Ik ben daarom met preg_match_all aan de slag gegaan zodat alle gevonden tekst in een array komt te staan.

PHP:
1
2
3
4
5
   $pattern_h = ('/<tr>[[:space:]\r\n\t]*
<td class="ContactListTableCheckboxCol">[[:space:]\r\n\t].*<\/td>
[[:space:]\r\n\t]*<td>[[:space:]\r\n\t].*<\/td>(.*?)<\/tr>/Uis');

   preg_match_all($pattern_h, $html, $matches);


Hij is nog niet helemaal af, maar zou al een deel moeten filteren. De (.*?) zou alles na het eerste deel en tussen de afsluiten </tr> tag moeten weergeven, maar de array blijft leeg.

Wat doe ik verkeerd?

Verder heb ik nog het volgende stuk:
HTML:
1
<a href="ContactViewLight.aspx?ContactID=788ac0de-b951-45c2-8795-8f7219d98a29&n=2018015942">Sanne&#x200f;</a>

Het ContactID kan afwijken. Hoe schrijf ik dit in een expressie? Gebruik ik dan het volgende?
PHP:
1
<a href=".*">(.*?)<\/a>

De tekst tussen de "" krijg ik volgens mij zo ook in mijn array en die tekst heb ik uiteraard niet nodig.

Ik hoop dat mijn verhaal een beetje duidelijk is.

Alvast bedankt

Acties:
  • 0 Henk 'm!

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

SchizoDuckie

Kwaak

• Les nummer 1: Gebruik geen regexen voor (het filteren uit) HTML
• Les nummer 2: Gebruik geen regexen voor (het filteren uit) HTML
• Les nummer 3: Zie les nummer 1 en 2

Ik doe nu al zo'n jaar of 8 PHP, en mijn ervaring is dat gewoon *niet* op te regexen tegen de ranzigheid van veel html. (Vooral niet als het vanaf 3e partijen komt, en onderhevig kan zijn aan veranderingen) Daarbij komt: regexen zijn ook gewoon *niet* bedoeld om HTML te parsen.

Doe mij (en jezelf) een plezier en gebruik, als je met valid XHTML werkt de DomDocument->loadHTML functie of zoek a.d.h.v. een regex een deel van je html op waar je wilt beginnen en regel de rest met strpos en substr. dat bespaart je een hoop hoofdpijn :)

[ Voor 12% gewijzigd door SchizoDuckie op 30-12-2007 00:43 ]

Stop uploading passwords to Github!


Acties:
  • 0 Henk 'm!

  • FragFrog
  • Registratie: September 2001
  • Laatst online: 22:47
In additie op Schizo's post: bijna alles wat je handmatig wil doen met strings in PHP is overbodig.

Reden hiervoor is dat PHP zelf al belachelijk veel manipulatie- en parsing functies heeft. Zo kun je voor jou specifieke probleem onder andere deze gebruiken:

Tidy
XML
XSLT
SimpleXML

Dit met de gedachte dat HTML in feite niets anders is dan een specifieke implementatie van XML :)

[ Site ] [ twitch ] [ jijbuis ]


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
FragFrog schreef op zondag 30 december 2007 @ 02:32:
Dit met de gedachte dat HTML in feite niets anders is dan een specifieke implementatie van XML :)
Toch zal een XML parser het gros van de HTML pagina's niet eens vreten, laat staan zinnige resultaten teruggeven ;) In dit geval gaat het al mis op de &nbsp;, dan op de &n= enz.

HTML is overigens geen specifieke implementatie van XML maar van SGML waarvan HTML en XML dus afgeleiden zijn (en dus eerder 'broertjes' zijn)

[edit]
Ah, ik ben geen echte PHP kenner, maar met Tidy zou je dus (wat ik zo snel opmaak uit de manuals) wellicht eerst de HTML kunnen 'fixen' als ik het goed begrijp na er dus heel vluchtig naar gekeken te hebben.

[ Voor 42% gewijzigd door RobIII op 30-12-2007 03:35 ]

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!

  • Fuzzillogic
  • Registratie: November 2001
  • Laatst online: 01-07 22:34
Mwuh, een scraper voor HTML-pagina's die toch telkens een identieke opbouw hebben lijkt mij prima met een regex te doen. Wellicht dat je nog met de greedyness kunt spelen.

Acties:
  • 0 Henk 'm!

  • FragFrog
  • Registratie: September 2001
  • Laatst online: 22:47
RobIII schreef op zondag 30 december 2007 @ 02:37:
HTML is overigens geen specifieke implementatie van XML maar van SGML waarvan HTML en XML dus afgeleiden zijn (en dus eerder 'broertjes' zijn)
I stand corrected :) Maar inderdaad, Tidy hoort in principe ervoor te zorgen dat je HTML makkelijk kan doorlopen en eventueel ook in een parser kan zetten.

[ Site ] [ twitch ] [ jijbuis ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Fuzzillogic schreef op zondag 30 december 2007 @ 02:42:
Mwuh, een scraper voor HTML-pagina's die toch telkens een identieke opbouw hebben lijkt mij prima met een regex te doen. Wellicht dat je nog met de greedyness kunt spelen.
Aangezien de structuur van de pagina niet zomaar wijzigt, dacht ik het met een regex te kunnen fixen. Maar ik heb geen idee waarom het mis gaat. Ben vanaf het begin van het html de regex gaan maken, maar dit mocht niet werken.

Ik zal ook eens kijken naar het tidy verhaal.

Als iemand toch nog ziet, wat ik precies verkeerd doe, stel ik dat zeer op prijs.

Acties:
  • 0 Henk 'm!

Verwijderd

Verwijderd schreef op zondag 30 december 2007 @ 14:34:
[...]

Als iemand toch nog ziet, wat ik precies verkeerd doe, stel ik dat zeer op prijs.
Tip: lees je HTML in met DOMDocument::loadHTML. Je kunt nu met Xpath door het DOM lopen. Dat is robuuster en beter te begrijpen dan een obscure reguliere expressie.

Acties:
  • 0 Henk 'm!

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

SchizoDuckie

Kwaak

om je nog wat verder op weg te helpen: ik kwam net dit tegen op www.digg.com:

http://krahulg.wordpress....the-html-dom-tree-in-php/

Stop uploading passwords to Github!


Acties:
  • 0 Henk 'm!

Verwijderd

HTML:
1
2
3
4
5
6
7
<tr>
<td class="ContactListTableCheckboxCol"><input type="checkbox" name="SelectedContacts" value="788ac0de-b951-45c2-8795-8f7219d98a29"  title="Een contactpersoon selecteren" id="788ac0de-b951-45c2-8795-8f7219d98a29" onclick="selectOne();" /></td>
<td>&nbsp;</td>
<td><a href="ContactViewLight.aspx?ContactID=788ac0de-b951-45c2-8795-8f7219d98a29&n=2018015942">#####TEKST1######</a></td>
<td class="NoWrap"><a href="#" onclick="submitToCompose('788ac0de-b951-45c2-8795-8f7219d98a29', 'EditMessageLight.aspx?n=1334871717');">######TEKST2######</a></td>
<td class="NoWrap">&nbsp;</td>
</tr>
Ik ben geen regex wiz, maar
PHP:
1
2
3
4
5
6
7
<?php
   $pattern_h = ('/<tr>[[:space:]\r\n\t]*
<td class="ContactListTableCheckboxCol">[[:space:]\r\n\t].*<\/td>
[[:space:]\r\n\t]*<td>[[:space:]\r\n\t].*<\/td>(.*?)<\/tr>/Uis');

   preg_match_all($pattern_h, $html, $matches);
?>

Ik zie achter die <td> geen tabs staan.
Verder staat er een <td class="NoWrap"> terwijl je in je pattern zoekt naar <td>

Zou het daaraan kunnen liggen?
Pagina: 1