[PHP] Pattern Modifiers

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Famous Copra
  • Registratie: April 2010
  • Laatst online: 07-09 09:55
Hallo,

Voor een script gebruik ik preg_match_all, maar dat werkt niet op elke site, dit zou kunnen komen door UTF-8 en daarvoor zou je naar deze site(http://www.php.net/manual...cre.pattern.modifiers.php) moeten gaan en dan naar beneden scrollen naar de u (niet te verwarren met de U) voor meer informatie. Maar nu snap ik niet hoe ik de u moet gebruiken

Dit is een deel van mijn code, en $data is een variabele die gemaakt is met file_get_contents.
$titel_extract = '~<div class="title">(.+?)</div>~';
preg_match_all($titel_extract,$data,$titel, PREG_PATTERN_ORDER);

Alvast bedankt.

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Famous Copra schreef op woensdag 09 november 2011 @ 17:10:
Maar nu snap ik niet hoe ik de u moet gebruiken
PHP:
1
preg_match_all('/mypattern/u', ..., ...);

:?
Er staan zelfs zat voorbeelden (en tips) in de comments op de pagina waar je notabene zelf naar verwijst?

[ Voor 76% gewijzigd door RobIII op 09-11-2011 17:38 ]

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!

  • Famous Copra
  • Registratie: April 2010
  • Laatst online: 07-09 09:55
ik had eerst de / aan het begin niet gezien, dus daarom werkte hij niet.

En nu heb ik dit
$titel_extract = '~/<div class="title">(.+?)</div>/u~';
voor de rest is alles hetzelfde, en nog steeds krijg ik een lege array. :?

Acties:
  • 0 Henk 'm!

Verwijderd

Haal de ~'jes eens weg.

Acties:
  • 0 Henk 'm!

  • Famous Copra
  • Registratie: April 2010
  • Laatst online: 07-09 09:55
Dan geeft ie als fout:


Warning: preg_match_all() [function.preg-match-all]: Unknown modifier 'd' in C:\xampp\htdocs\PHP\qmusic.php on line 4
NULL

Ik zal even verklaren wat ik wil. Ik wil graag de hitlijsten van verschillende radiostations ophalen. Nu heb ik dit al: http://localhost/PHP/webscraping3.php

alleen zodra ik dit probeer voor q-music lukt het niet (http://www.q-music.nl/page/itunestop30)

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
</div>
Zul je moeten escapen. Of je moet andere delimiters (zoals de tilde die je had bijvoorbeeld) moeten gebruiken.
Dan krijg je zoiets:
PHP:
1
preg_match_all('~mypattern~u', ..., ...);


Andere relevante stukken van die pagina die je waarschijnlijk dient te weten (of: had moeten lezen):
If the delimiter appears often inside the pattern, it is a good idea to choose another delimiter in order to increase readability.
...
You may add pattern modifiers after the ending delimiter.
Famous Copra schreef op woensdag 09 november 2011 @ 18:22:
Nu heb ik dit al: http://localhost/PHP/webscraping3.php
Oh, dat is inderdaad handig voor ons om te zien :X :P
Hou je er rekening mee dat veel bedrijven/sites/instanties 't scrapen van dergelijke info niet altijd op prijs stellen (of zelfs keihard de voorwaarden overtreden)?

[ Voor 144% gewijzigd door RobIII op 09-11-2011 18:37 ]

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!

  • GlowMouse
  • Registratie: November 2002
  • Niet online
Een ~ is slimmer als delimiter dan /, omdat de ~ niet in zijn regexp voorkomt.

http://www.php.net/manual/en/regexp.reference.delimiters.php is mooier leesvoer, daar staat ook precies wat je met zo'n pattern modifier als u moet doen.

[ Voor 26% gewijzigd door GlowMouse op 09-11-2011 18:37 ]


Acties:
  • 0 Henk 'm!

  • Ventieldopje
  • Registratie: December 2005
  • Laatst online: 18:36

Ventieldopje

I'm not your pal, mate!

Famous Copra schreef op woensdag 09 november 2011 @ 18:22:
Dan geeft ie als fout:


Warning: preg_match_all() [function.preg-match-all]: Unknown modifier 'd' in C:\xampp\htdocs\PHP\qmusic.php on line 4
NULL

Ik zal even verklaren wat ik wil. Ik wil graag de hitlijsten van verschillende radiostations ophalen. Nu heb ik dit al: http://localhost/PHP/webscraping3.php

alleen zodra ik dit probeer voor q-music lukt het niet (http://www.q-music.nl/page/itunestop30)
Dit komt dus omdat je in je $titel_extract / gebruikt als delimiter. Dit botst dus met </div>. Hij denkt dus dat je daar het einde van de string mee bedoelt vanwege die eind delimiter en na de eind delimiter komen de modifiers zoals i (case insensitive) etc. ;)

Even goed in lezen en je komt er wel.

www.maartendeboer.net
1D X | 5Ds | Zeiss Milvus 25, 50, 85 f/1.4 | Zeiss Otus 55 f/1.4 | Canon 200 f/1.8 | Canon 200 f/2 | Canon 300 f/2.8


  • Famous Copra
  • Registratie: April 2010
  • Laatst online: 07-09 09:55
Het werkt nog steeds niet?! en ik heb geen idee waar het aan ligt.

Iemand suggesties?

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Je pattern string heeft helemaal geen karakters die alleen via Unicode beschikbaar zijn, dus die u-modifier doet nu helemaal niks. Ik krijg hiermee gewoon netjes matches op de dingen die ik verwacht als ik die HTML als invoer neem:
PHP:
1
2
3
if (preg_match_all('~<div class="title">(.+?)</div>~s', $html, $matches)) {
    var_dump($matches);
}

Verder moeten we je in dit topic wel heel erg aan het handje nemen en maak je wel heel erg duidelijke fouten. Vooral in de post waarin je twee verschillende sets delimiters gebruikt en vervolgens niet ziet dat je fouten krijgt vanwege het gebrek aan escapen geven aan dat je de manualpagina die je zelf linkt eigenlijk niet eens goed doorgenomen hebt. Ik stel voor dat je die eerst nog even goed door gaat lezen voordat je verdere vragen stelt. ;)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • Famous Copra
  • Registratie: April 2010
  • Laatst online: 07-09 09:55
Hallo,

Ik was er inderdaad achter gekomen dat het niet aan unicode lag want dat zei ik in mijn vorige post,

Verder vind ik het knap als je daar matches mee krijgt, want de " die je gebruikt in het eerste deel van preg_match_all worden door class=" weer afgesloten dus dat kan sowieso niet. Als we daarna de dubbelquotes vervangen door ' werkt het ook niet.

En je sluit je if ook niet af. kortom ik zie ook zeer veel fouten in jouw script... Dus vind ik het erg knap als dat werkt...

Zou je mij even je hele script kunnen laten zien dan kan ik dat testen, misschien dat ik gewoon dom bezig ben en iets over het hoofd zie. Maar ik kom er gewoon niet uit. Terwijl het me wel gelukt is met SLAM!FM ( http://rubensteendam.0sites.org/php/webscraping3.php ). En ik gebruik gewoon precies hetzelfde, met als aanpassingen de site en hetgeen waar de preg_match op moet zoeken.

Edit: Sorry als dit boos/geirriteerd overkomt. Maar in het script wat jij laat zien werkt het ook bij mij niet en daar zie ik ook al een aantal fouten instaan + ik heb wel zeker nagedacht voor ik iets deed. Dank jullie wel ;)

[ Voor 11% gewijzigd door Famous Copra op 10-11-2011 14:55 ]


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Ik neem aan dat het duidelijk mag zijn dat het om wat tikfoutjes ging die ik maakte bij het overnemen van mijn code. Ik heb mijn foutjes verbeterd én nogmaals getest, bovenstaande code werkt gewoon.

Verder mis je gewoon de dotall modifier die nota bene zowat bovenaan staat op je handleiding die je linkt. De tekst die je wil matchen bevat meerdere newlinekarakters en een . matcht standaard niet op die karakters, tenzij je die modifier gebruikt.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • Famous Copra
  • Registratie: April 2010
  • Laatst online: 07-09 09:55
Dank je!

Ik had de s niet gezien in je code :S mijn excuses dus voor mijn reactie, want het script klopte dus wel op wat typo's na. Maar wat bedoel je nu eigenlijk precies met newlinekarakters e.d. Want dan snap ik ook nog waarom de s nodig is. Want ik snap het niet echt als ik op php.net kijk. Ben redelijk nieuw met php, heb wel eens eerder iets in php gedaan maar dat was een login systeem bouwen (PHP + MYSQL) maar dat was iets heel anders.

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Famous Copra schreef op donderdag 10 november 2011 @ 16:37:
Maar wat bedoel je nu eigenlijk precies met newlinekarakters e.d.
Is je google stuk ofzo? Zoals NMe al zei; we zitten hier niet om handjes te houden en dit soort zaken kun je prima zelf uitzoeken.
[google=newline] >> Wikipedia: Newline
Famous Copra schreef op donderdag 10 november 2011 @ 16:37:
Want ik snap het niet echt als ik op php.net kijk.
Wat snap je dan niet :? Of je verwacht dat we helderziend zijn, of je verwacht dat we het je stap-voor-stap gaan uitleggen/voorkauwen en ik kan je vertellen dat het eerste niet het geval is en het tweede niet gaat gebeuren ;)

[ Voor 33% gewijzigd door RobIII op 10-11-2011 17:12 ]

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

Pagina: 1