[PHP] link uit lap tekst vissen met een Regular Expression

Pagina: 1
Acties:
  • 572 views sinds 30-01-2008
  • Reageer

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik post vanuit een php script een berichtje naar blogger.
Google's gdata api geeft mij onderstaande lap xml terug:

Ik wil met:
PHP:
1
preg_match_all("/link rel='alternate' type='text/html' href='(.*)' title/",preg_quote($data),$return_url, PREG_PATTERN_ORDER);

die "alternate" link eruit vissen. Nou zijn regular expressions niet mijn sterkste punt.
Ik heb een halve dag lopen zoeken naar waarom mijn regex telkens iets meer of minder teruggeeft dan ik wil. De diverse regex builders bieden in mijn geval ook geen uitkomst.

Ik dacht dat de bovenstaande expression alles tussen href=' en ' title/ teruggeeft maar ik krijg steeds meer terug.

Voor de duidelijkheid, als je naar de onderstaande lap tekst kijkt wil ik alleen:

overhouden

Is er iemand die mij een duwtje in de goede richting kan geven? Bij voorbaad dank.

XML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?xml version='1.0' encoding='UTF-8'?>
<?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?>
<entry xmlns='http://www.w3.org/2005/Atom'>
<id>tag:blogger.com,1999:blog-7168474548405150398.post-6647370729285262087</id>
<published>2007-12-28T04:31:00.001-08:00</published>
<updated>2007-12-28T04:31:18.121-08:00</updated>
<title type='text'>test</title>
<content type='html'><div xmlns='http://www.w3.org/1999/xhtml'>g</div></content>
<link rel='alternate' type='text/html' href='http://jaww2.blogspot.com/2007/12/fg.html' title='fg'/>
<link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7168474548405150398&postID=6647370729285262087' title='0 reacties'/>
<link rel='replies' type='application/atom+xml' href='http://jaww2.blogspot.com/feeds/6647370729285262087/comments/default' title='Reacties plaatsen'/>
<link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7168474548405150398/posts/default/6647370729285262087'/>
<link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7168474548405150398/posts/default/6647370729285262087'/>
<author>
<name>Jasper</name>
</author>
</entry>

Acties:
  • 0 Henk 'm!

  • GlowMouse
  • Registratie: November 2002
  • Niet online
Regexes matchen altijd een zo lang mogelijk stuk. In dit geval moet je dus opgeven dat er in het (.*) stukje geen apostrof voor mag komen.

bij voorbaat

Acties:
  • 0 Henk 'm!

  • Borizz
  • Registratie: Maart 2005
  • Laatst online: 24-08 20:35
Wellicht dat je iets aan XPath hebt, dat is misschien iets eenvoudiger dan reguliere expressies maken. Er is ook een XPath package beschikbaar in PEAR. Wellicht dat je die kan gebruiken.
GlowMouse schreef op vrijdag 28 december 2007 @ 16:27:
Regexes matchen altijd een zo lang mogelijk stuk. In dit geval moet je dus opgeven dat er in het (.*) stukje geen apostrof voor mag komen.

bij voorbaat
Of je maakt de reguliere expressie 'non greedy' door een vraagtegen achter de .* te plaatsen: (.*?). Dan matcht ie het korst mogelijk matchende stuk.

[ Voor 41% gewijzigd door Borizz op 28-12-2007 16:36 ]

If I can't fix it, it ain't broken.


Acties:
  • 0 Henk 'm!

  • Scotix
  • Registratie: Juni 2002
  • Laatst online: 21:18
Tijdje geleden had ik ook een gelijk soort topic.

Kijk hier maar even naar:

Cyphax in "[PHP] bepaalde Table rows uit broncode h..."

Acties:
  • 0 Henk 'm!

  • remcotolsma
  • Registratie: December 2005
  • Laatst online: 08-09 11:11
Als je met PHP5 werkt kun je er ook voor kiezen om dit met SimpleXML op te lossen:

PHP:
1
2
3
4
5
6
$xml = new SimpleXMLElement($data);

foreach ($xml->link as $link) {
  $url = (string) $link['href'];
  echo $url, '<br />';
}


Ook kun je erg eenvoudig de andere gegevens benaderen:

PHP:
1
2
$authorName = (string) $xml->author->name;
echo $authorName;

Acties:
  • 0 Henk 'm!

  • EnsconcE
  • Registratie: Oktober 2001
  • Laatst online: 19-06 00:07
Verwijderd schreef op vrijdag 28 december 2007 @ 16:23:
Ik post vanuit een php script een berichtje naar blogger.
Google's gdata api geeft mij onderstaande lap xml terug:

Ik wil met:
PHP:
1
preg_match_all("/link rel='alternate' type='text/html' href='(.*)' title/",preg_quote($data),$return_url, PREG_PATTERN_ORDER);

die "alternate" link eruit vissen. Nou zijn regular expressions niet mijn sterkste punt.
Ik heb een halve dag lopen zoeken naar waarom mijn regex telkens iets meer of minder teruggeeft dan ik wil. De diverse regex builders bieden in mijn geval ook geen uitkomst.

Ik dacht dat de bovenstaande expression alles tussen href=' en ' title/ teruggeeft maar ik krijg steeds meer terug.

Voor de duidelijkheid, als je naar de onderstaande lap tekst kijkt wil ik alleen:

overhouden

Is er iemand die mij een duwtje in de goede richting kan geven? Bij voorbaad dank.

XML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?xml version='1.0' encoding='UTF-8'?>
<?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?>
<entry xmlns='http://www.w3.org/2005/Atom'>
<id>tag:blogger.com,1999:blog-7168474548405150398.post-6647370729285262087</id>
<published>2007-12-28T04:31:00.001-08:00</published>
<updated>2007-12-28T04:31:18.121-08:00</updated>
<title type='text'>test</title>
<content type='html'><div xmlns='http://www.w3.org/1999/xhtml'>g</div></content>
<link rel='alternate' type='text/html' href='http://jaww2.blogspot.com/2007/12/fg.html' title='fg'/>
<link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7168474548405150398&postID=6647370729285262087' title='0 reacties'/>
<link rel='replies' type='application/atom+xml' href='http://jaww2.blogspot.com/feeds/6647370729285262087/comments/default' title='Reacties plaatsen'/>
<link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7168474548405150398/posts/default/6647370729285262087'/>
<link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7168474548405150398/posts/default/6647370729285262087'/>
<author>
<name>Jasper</name>
</author>
</entry>
Misschien helpt het te sluiten met de U modifier, oftewerl ungreedy:
PHP:
1
preg_match_all("/<link rel='alternate'(.*)>/U",preg_quote($data),$return_url, PREG_PATTERN_ORDER);


Ik heb het bovenstaande niet getest, maar het moet ook werken.

Je zegt meer terug te krijgen, wat krijg je precies terug?

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
met
PHP:
1
2
3
<?php
preg_match_all("/<link rel='alternate'(.*)>/U",preg_quote($data),$return_url, PREG_PATTERN_ORDER);
?>


krijg ik de volgende var_dump terug:

array(2) { [0]=> array(0) { } [1]=> array(0) { } }

Helemaal leeg dus.Dit snap ik dus helemaal niet, volgens mij zou hij dus alles tussen 'alternate' en het eerste > terug moeten geven

Acties:
  • 0 Henk 'm!

  • EnsconcE
  • Registratie: Oktober 2001
  • Laatst online: 19-06 00:07
Het zou beter zijn wanneer je je volledige code hier neer zet, op dit moment is het mij niet duidelijk hoe jouw code precies werkt.

Edit:
code:
1
echo preg_quote($data);


^je probleem

[ Voor 20% gewijzigd door EnsconcE op 03-01-2008 14:12 ]

Pagina: 1