[PHP] Quotes matchen met preg_match_all()

Pagina: 1
Acties:

Onderwerpen


  • monnick
  • Registratie: December 2005
  • Niet online
Ik probeer filmtitels te matchen met preg_match_all(), alleen filmtitels die een ' of " gaan niet goed. Ik gebruik de volgende reguliere expressie:

code:
1
([a-zA-Z0-9-:\'\" ]{2,50})


Dat werkt dus niet, bij Schindler's List en One Flew Over The Cuckoo's Nest krijg je dan als output:

code:
1
2
s List
s Nest


Ik heb uitgebreid gezocht maar niet kunnen vinden hoe ik dit probleem zou kunnen oplossen. Ik heb ook gekeken naar \x27 binnen de ronde haakjes. Hierbij is 27 de hexadecimale representatie van ', maar dit werkt (ook) niet.

Iemand die de oplossing weet? :*)

  • Spinal
  • Registratie: Februari 2001
  • Laatst online: 19-09 13:37
offtopic:
(2,50)? Dus Dr. Strangelove en M sta je niet toe? :'(

ontopic: ik weet het niet 100% zeker, maar wellicht moet je de \ ook escapen? Dan zou je \\'\\" krijgen. Pin me er niet op vast :X er zijn ongetwijfeld mensen hier die het beter weten.

[ Voor 5% gewijzigd door Spinal op 16-09-2010 16:37 ]

Full-stack webdeveloper in Groningen


  • monnick
  • Registratie: December 2005
  • Niet online
Ja, die {2,50} kan ik beter aanpassen! Thanks voor de tip :)

Waarschijnlijk werkt \' of \" wel gewoon. Alleen het probleem was dat ik de waardes binnenkreeg als html en dus voor ' de volgende code: &#039 ;
Daarom is mijn regex nu geworden:

code:
1
([a-zA-Z0-9-:\&\;\#\., ]{0,80})


Voor zo ver ik kan zien werken nu alle films goed. Maar ik moet nog wel wat uitgebreider testen met speciale tekens :)

  • Morax
  • Registratie: Mei 2002
  • Laatst online: 20-09 00:30
Je kan ook de binnenkomende string eerst decoden door gebruik te maken van htmlspecialchars_decode() (http://nl.php.net/manual/...mlspecialchars-decode.php) :)

[ Voor 10% gewijzigd door Morax op 16-09-2010 17:00 ]

What do you mean I have no life? I am a gamer, I got millions!


  • ReenL
  • Registratie: Augustus 2010
  • Laatst online: 14-09-2022
monnick schreef op donderdag 16 september 2010 @ 16:10:
(...)
Ik gebruik de volgende reguliere expressie:
(...)
Om wat te doen?

  • frickY
  • Registratie: Juli 2001
  • Laatst online: 18-09 14:42
Hoe ziet je input er uit?
Zoals Morax al verwacht konden dat wel eens htmlentities zijn, zoals een " in plaats van een ".

Het is netter om die htmlentities om te zetten naar de daadwerkelijke karakters die zij vertegenwoordigen, bijv. met html_entity_decode().

Sowieso kun je, als je toch alle leestekens wilt matchen, ook [[:print:]] gebruiken.
code:
1
([[:print:]]+)

[ Voor 29% gewijzigd door frickY op 16-09-2010 17:53 ]


  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 02:21

Janoz

Moderator Devschuur®

!litemod

Eens met ReenL. Een filmtitel is niet als een datum, telefoonnummer, email of postcode. Proberen een reguliere expressie op te stellen impliceert dat er regels zijn waar regisseurs zich aan zouden moeten houden.

EN om nog een duit in het zakje te doen, wat dacht je bijvoorbeeld van Æon Flux?

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


  • monnick
  • Registratie: December 2005
  • Niet online
@ frickY: dat [[:print:]] is een handige tip, zal ik zo direct eens even proberen. Alsmede html_entity_decode(), ik ben het er mee eens dat dat een stuk netter is :)

@ Janoz: het gaat alleen films uit de IMDb top 250, daarin komen niet dat soort vreemde tekens voor ;)

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
monnick schreef op donderdag 16 september 2010 @ 21:29:
daarin komen niet dat soort vreemde tekens voor ;)
...op het moment ;)

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


  • Wolfboy
  • Registratie: Januari 2001
  • Niet online

Wolfboy

ubi dubium ibi libertas

Niet waar, "Amélie" staat ook in de top 250 ;)

Genoeg films met vreemde tekens in de top 250, maar ze hebben eigenlijk allemaal een internationale titel erbij (die je dus in de top 250 ziet) zodat iedereen het normaal kan typen. Neem "Spirited Away" bijvoorbeeld, de originele titel daarvan is "千と千尋の神隠し"

Blog [Stackoverflow] [LinkedIn]


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Wolfboy schreef op donderdag 16 september 2010 @ 22:11:
[...]
Niet waar, "Amélie" staat ook in de top 250 ;)
Ik had even niet daadwerkelijk gecontroleerd of die uitspraak waar was; ik nam 't even voor waar aan ;) Iets met assumptions en fuckups; I know :$

Edit: Oeh, op 178 staat ook nog een leuke: 8½ (1963) :Y)

[ Voor 30% gewijzigd door RobIII op 16-09-2010 22:34 ]

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


  • monnick
  • Registratie: December 2005
  • Niet online
RobIII schreef op donderdag 16 september 2010 @ 22:29:
[...]

Ik had even niet daadwerkelijk gecontroleerd of die uitspraak waar was; ik nam 't even voor waar aan ;) Iets met assumptions en fuckups; I know :$

Edit: Oeh, op 178 staat ook nog een leuke: 8½ (1963) :Y)
Als je niet die html_entity_decode() ofzo gebruikt gaat het in ieder geval goed door gewoon regex op # & en ; te gebruiken. :)

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 02:21

Janoz

Moderator Devschuur®

!litemod

Ah, dat dacht ik dus al :).

De denkfout die je maakt is dat je, om een specifiek stuk informatie uit de pagina te halen, je een patroon moet verzinnen voor precies datgene wat je zoekt. Vaak is dat wel zo, maar het gaat niet op wanneer er helemaal geen patroon voor is.

Je moet je zoektocht iets verruimen. Je kunt beter kijken naar patronen vlak voor de titel en vlak na de titel.

En de lengte van max 50? Dan moet je maar hopen dat deze niet in de top 250 terecht komt.

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


  • monnick
  • Registratie: December 2005
  • Niet online
Janoz schreef op donderdag 16 september 2010 @ 22:41:
Ah, dat dacht ik dus al :).

De denkfout die je maakt is dat je, om een specifiek stuk informatie uit de pagina te halen, je een patroon moet verzinnen voor precies datgene wat je zoekt. Vaak is dat wel zo, maar het gaat niet op wanneer er helemaal geen patroon voor is.

Je moet je zoektocht iets verruimen. Je kunt beter kijken naar patronen vlak voor de titel en vlak na de titel.

En de lengte van max 50? Dan moet je maar hopen dat deze niet in de top 250 terecht komt.
Ik maak geen denkfout hoor, dat is uiteraard precies wat ik gescript heb. De IMDb pagina wordt uitgelezen en ik kijk steeds naar html elementen om de desbetreffende gegevens die ik zoek. Werkt nu als een trein, de hele IMDb top 250 wordt keurig uitgelezen (met vreemde tekens ;) ).

Eigenlijk heb ik bijna nooit iets met reguliere expressies gedaan, maar ik begin ze steeds meer te waarderen. De learning curve is wat stijl, maar als je het eenmaal een beetje onder de knie hebt is het reuze handig! Ook mooi dat het voor mensen die geen regex kennen echt lijkt alsof er complete onzin staat in je match pattern :p

offtopic:
Ja, ik weet dat IMDb scrapen niet leuk vindt. Maar eens in de week de top 250 fetchen zal geen probleem zijn :)

Acties:
  • 0 Henk 'm!

  • Morax
  • Registratie: Mei 2002
  • Laatst online: 20-09 00:30
monnick schreef op donderdag 16 september 2010 @ 22:57:
[...]

Ik maak geen denkfout hoor, dat is uiteraard precies wat ik gescript heb. De IMDb pagina wordt uitgelezen en ik kijk steeds naar html elementen om de desbetreffende gegevens die ik zoek. Werkt nu als een trein, de hele IMDb top 250 wordt keurig uitgelezen (met vreemde tekens ;) ).

Eigenlijk heb ik bijna nooit iets met reguliere expressies gedaan, maar ik begin ze steeds meer te waarderen. De learning curve is wat stijl, maar als je het eenmaal een beetje onder de knie hebt is het reuze handig! Ook mooi dat het voor mensen die geen regex kennen echt lijkt alsof er complete onzin staat in je match pattern :p

offtopic:
Ja, ik weet dat IMDb scrapen niet leuk vindt. Maar eens in de week de top 250 fetchen zal geen probleem zijn :)
Maar wat wij proberen duidelijk te maken, is dat je geen reden hebt om te matchen op een specifieke set tekens. Zolang jij weet dat een filmtitel zich altijd bevind tussen bepaalde unieke strings, kan je matchen op die unieke strings (die zijn altijd gelijk voor elke film), en kan je alles daar tussen matchen. Dan werkt je reguliere expressie altijd goed, ongeacht lengte of tekens die erin staan :)

What do you mean I have no life? I am a gamer, I got millions!


Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 02:21

Janoz

Moderator Devschuur®

!litemod

De enige correcte regexp voor een filmtitel is .*
Ja, ik weet dat IMDb scrapen niet leuk vindt. Maar eens in de week de top 250 fetchen zal geen probleem zijn.
Dat ze het niet willen hebben heeft helemaal niks te maken met de load op hun server.

[ Voor 68% gewijzigd door Janoz op 17-09-2010 09:33 ]

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!

  • MueR
  • Registratie: Januari 2004
  • Laatst online: 14:53

MueR

Admin Tweakers Discord

is niet lief

Wat Janoz zegt. Lees deze pagina maar eens door (indien voor een persoonlijk, niet commercieel project), of deze pagina indien het om een commercieel project gaat (al hoop ik dat niet, met de aannames en keuzes die je maakt).

Anyone who gets in between me and my morning coffee should be insecure.


Acties:
  • 0 Henk 'm!

  • Morax
  • Registratie: Mei 2002
  • Laatst online: 20-09 00:30
Janoz schreef op vrijdag 17 september 2010 @ 09:31:
De enige correcte regexp voor een filmtitel is .*


[...]

Dat ze het niet willen hebben heeft helemaal niks te maken met de load op hun server.
Ik zou zeggen, de enige correcte regexp is .+ (minimaal 1 teken) :)

What do you mean I have no life? I am a gamer, I got millions!


Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 02:21

Janoz

Moderator Devschuur®

!litemod

Hmm, ik zal eens even kijken in de "Universaly Mandatory Movie Title Naming Guide" of er ergens staat dat een filmtitel uit minimaal 1 teken zou moeten bestaan.... ;)

Kom, je zit in de hoek van de cultuur. Er hoeft maar 1 "gehoornbrilde intellectueel" te bedenken dat hij zijn film "" gaat noemen en in principe kan niemand hem dat verbieden.

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!

  • pascalw
  • Registratie: Februari 2008
  • Laatst online: 19-09 18:23
Wat ik dan weer niet snap is waarom je regex gebruikt om html parsen. Gebruik dan gewoon een, juist ja, html parser. Iets met right tool for the right job ;)

[ Voor 15% gewijzigd door pascalw op 17-09-2010 11:35 ]


Acties:
  • 0 Henk 'm!

  • Wolfboy
  • Registratie: Januari 2001
  • Niet online

Wolfboy

ubi dubium ibi libertas

Janoz schreef op donderdag 16 september 2010 @ 22:41:
Ah, dat dacht ik dus al :).

De denkfout die je maakt is dat je, om een specifiek stuk informatie uit de pagina te halen, je een patroon moet verzinnen voor precies datgene wat je zoekt. Vaak is dat wel zo, maar het gaat niet op wanneer er helemaal geen patroon voor is.

Je moet je zoektocht iets verruimen. Je kunt beter kijken naar patronen vlak voor de titel en vlak na de titel.
Als je kan herkennen hoe/waar de naam voor komt kan je gewoon op die locatie zoeken. Voor html kan je meestal wel heel wat met xpath :)
En de lengte van max 50? Dan moet je maar hopen dat deze niet in de top 250 terecht komt.
Een rating van 3.1, no worries there :+

Blog [Stackoverflow] [LinkedIn]


Acties:
  • 0 Henk 'm!

  • monnick
  • Registratie: December 2005
  • Niet online
Ach, een html parser gebruiken lijkt me in dit geval niet beter dan regex. Regex doen in ieder geval prima hun werk ;)

@ Morax, bedankt voor die reactie. Dat heb ik nog even verterderd. Het is nu iets in de vorm van <html tag>(.+)</html tag> En dat is een nettere oplossing dan al die losse toegestane tekens definiëren :)

En wat IMDb van page scraping vindt zal me eigenlijk maar een worst wezen, zo lang ik die informatie maar krijg :p

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Janoz schreef op vrijdag 17 september 2010 @ 11:13:
Kom, je zit in de hoek van de cultuur. Er hoeft maar 1 "gehoornbrilde intellectueel" te bedenken dat hij zijn film "" gaat noemen en in principe kan niemand hem dat verbieden.
One word:
Afbeeldingslocatie: http://upload.wikimedia.org/wikipedia/en/thumb/a/af/Prince_logo.svg/130px-Prince_logo.svg.png

:P

érgens houdt 't op natuurlijk ;)

[ Voor 4% gewijzigd door RobIII op 17-09-2010 17:30 ]

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!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 16:28
Enigzins off-topic, maar binnen een character class hoef je karakters niet te escapen (en dat kan ook niet). Je character class zou dus gewoon \[a-zA-Z0-9-:'" ] moeten zijn, tenzij je de backslash er ook in wil hebben, maar dan hoef je 'm niet twee keer op te geven.

In een PHP string moeten sommige karakters natuurlijk wel geëscapet worden, maar dan slechts één van de twee soorten quotes (afhankelijk van welke je gebruikt; waarschijnlijk is een enkele quote hier het beste).

En voor de mensen die zich nu afvragen hoe je zonder escaping tekens als ']' en '-' kunt opgeven in een character class: '-' mag aan het begin of het eind opgegeven worden en wordt dan niet als range geïnterpreteerd en ']' wordt niet als sluitend haakje gezien als die als eerste karakter opgegeven wordt (een lege character class bestaat dus niet). Bijvoorbeeld: \[]-] matcht precies een ']' óf een '-'.
Da's niet eens een Unicode karakter dus die telt i.m.o. niet. Als ik me niet vergis is de hele IMDB trouwens in Latin-1 (ISO 8859-1) gecodeerd, dus dat beperkt de mogelijkheden aanzienlijk. Vandaar dat Aziatische films en dergelijke ook niet met de oorspronkelijke titel in Aziatisch schrift aangegeven worden. Primitief, maar de data dumps van IMDB zijn ook nog gewoon tab-separated plain-text files. :X (Al neem ik aan dat de website wel op een relatationele database draait tegenwoordig.)

[ Voor 49% gewijzigd door Soultaker op 17-09-2010 17:54 ]


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Soultaker schreef op vrijdag 17 september 2010 @ 17:44:
Da's niet eens een Unicode karakter dus die telt i.m.o. niet.
En toch is die eppo zo een tijd door het leven gegaan. Dat 't dan allemaal als "The Sign", "The Symbol", "O(+>" of whatnot wordt opgeslagen omdat er geen karakter voor is, is dan dus gewoon "behelpen" geweest; dat is hetzelfde als 千と千尋の神隠し opslaan als "Spirited away" wegens technische beperkingen.

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!

  • pedorus
  • Registratie: Januari 2008
  • Niet online
monnick schreef op vrijdag 17 september 2010 @ 17:15:
@ Morax, bedankt voor die reactie. Dat heb ik nog even verterderd. Het is nu iets in de vorm van <html tag>(.+)</html tag> En dat is een nettere oplossing dan al die losse toegestane tekens definiëren :)
Het is gebruikelijk om in zo'n situatie alles te matchen behalve wat je niet wil, dan hoef je ook niet ungreedy te matchen. Hier dus [^<]++ (++ omdat backtracking toch niet nodig is). En ik denk niet dat je rekening hoef te houden met de film zonder titel, want dan heeft imdb zelf ook een probleem. ;)
En wat IMDb van page scraping vindt zal me eigenlijk maar een worst wezen, zo lang ik die informatie maar krijg :p
Disclaimer: mijn posts dienen niet als aanleiding te worden gezien tot mogelijke rechtenschendingen. Ga dit altijd zelf na. :p

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


Acties:
  • 0 Henk 'm!

  • Wolfboy
  • Registratie: Januari 2001
  • Niet online

Wolfboy

ubi dubium ibi libertas

RobIII schreef op vrijdag 17 september 2010 @ 18:09:
En toch is die eppo zo een tijd door het leven gegaan. Dat 't dan allemaal als "The Sign", "The Symbol", "O(+>" of whatnot wordt opgeslagen omdat er geen karakter voor is, is dan dus gewoon "behelpen" geweest; dat is hetzelfde als 千と千尋の神隠し opslaan als "Spirited away" wegens technische beperkingen.
offtopic:
Eigenlijk is "Spirited Away" de internationale titel.
"(千と千尋の神隠し" de officiele Japanse titel
En "Sen to Chihiro no Kamikakushi" is de Japanse titel geschreven in standaard ascii wegens technische beperkingen :P

Blog [Stackoverflow] [LinkedIn]

Pagina: 1