[PHP] Mbv regex (?) image eigenschappen uit tekst filteren

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

Onderwerpen


Acties:
  • 0 Henk 'm!

  • aaajeetee
  • Registratie: Augustus 2002
  • Laatst online: 20-09 16:31
Dag,

Ik heb nu een (grote lap) tekst, waarin images (<img ...>) kunnen staan.
Van deze images wil ik graag de eigenschappen (dus de alt-, src-tekst etc) op kunnen halen.
Zoiets dus:
code:
1
2
3
4
5
6
7
8
Array ( 0   =>
            Array(  alt     =>  "de alt tekst",
                src =>  "plaatje.jpg"
            ),
    1   =>
            Array(  src =>  "plaatje2.jpg"
            )
)

Ik denk dat dit mbv een regex wel te doen is, alleen snap ik geen drol van regexen..

Misschien dat iemand mij op weg kan helpen?
Om in ieder geval alle images uit de tekst te filteren zou mij al een eind op weg helpen _/-\o_

Acties:
  • 0 Henk 'm!

  • Cavorka
  • Registratie: April 2003
  • Laatst online: 27-03-2018

Cavorka

Internet Entrepreneur

the-blueprints.com - The largest free blueprint collection on the internet: 50000+ drawings.


Acties:
  • 0 Henk 'm!

Verwijderd

De regex coach is zinloos als je niet kan regexen :+

preg_match('/<img src="(.*?)" alt="(.*?)">/is', $source, $matches);

Zoiets zou moeten werken, is redelijk simpel. Had je opzich wel kunnen koekelen. :)

Acties:
  • 0 Henk 'm!

  • aaajeetee
  • Registratie: Augustus 2002
  • Laatst online: 20-09 16:31
Verwijderd schreef op donderdag 26 april 2007 @ 11:43:
De regex coach is zinloos als je niet kan regexen :+

preg_match('/<img src="(.*?)" alt="(.*?)">/is', $source, $matches);

Zoiets zou moeten werken, is redelijk simpel. Had je opzich wel kunnen koekelen. :)
Was ik misschien nog vergeten te vertellen, maar de volgorde van die attributen staat neit vast..
dus <img src...> zou ie moeten parsen, maar ook <img class = ... src = ...> etc..

Acties:
  • 0 Henk 'm!

Verwijderd

Maak een regex alt=" alle chars, alle hoeveelheden en eindigd op ".

Acties:
  • 0 Henk 'm!

  • Spider.007
  • Registratie: December 2000
  • Niet online

Spider.007

* Tetragrammaton

Verwijderd schreef op donderdag 26 april 2007 @ 11:43:
De regex coach is zinloos als je niet kan regexen :+

preg_match('/<img src="(.*?)" alt="(.*?)">/is', $source, $matches);

Zoiets zou moeten werken, is redelijk simpel. Had je opzich wel kunnen koekelen. :)
Dan ben je afhankelijk van de volgorde van de argumenten. Slimmer is het om alle properties er iets dynamischer uit te halen; zoiets dus:

code:
1
preg_match_all('~<img (([a-z]+)="([^"]+)")+ />~is', $source, $matches, PREG_PATTERN_ORDER);

---
Prozium - The great nepenthe. Opiate of our masses. Glue of our great society. Salve and salvation, it has delivered us from pathos, from sorrow, the deepest chasms of melancholy and hate


Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Laatst online: 21:18

crisp

Devver

Pixelated

Of eerst de complete tags matchen en in een tweede iteratie daaruit de attributen vissen ;)

Intentionally left blank


Acties:
  • 0 Henk 'm!

  • Cavorka
  • Registratie: April 2003
  • Laatst online: 27-03-2018

Cavorka

Internet Entrepreneur

Verwijderd schreef op donderdag 26 april 2007 @ 11:43:
De regex coach is zinloos als je niet kan regexen :+
Als je niet kan regexen, moet je niet gaan regexen...

Zo ken ik er nog wel een paar. ;) Hoe moet hij het nou leren als je alles voorkauwt?

En dan waarom blijft dit topic open als hij het antwoord krijgt op een script request?

the-blueprints.com - The largest free blueprint collection on the internet: 50000+ drawings.


Acties:
  • 0 Henk 'm!

Verwijderd

Spider.007 schreef op donderdag 26 april 2007 @ 11:50:

code:
1
preg_match_all('~<img (([a-z]+)="([^"]+)")+ />~is', $source, $matches, PREG_PATTERN_ORDER);
Even inhakend op bovenstaand voorbeeldje: Die ~ waartussen het pattern staat zijn nieuw voor me. Ook nooit tegengekomen in documentatie her en der. Wat doen die t.o.v. de / en waar is daarover wat te lezen?

Wat Crisp zegt lijkt me trouwens de way to go m.b.t. het issue van de TS.

Acties:
  • 0 Henk 'm!

  • Tjark
  • Registratie: Juni 2000
  • Laatst online: 18-09 23:26

Tjark

DON'T PANIC

Spider.007 schreef op donderdag 26 april 2007 @ 11:50:
[...]
code:
1
preg_match_all('~<img (([a-z]+)="([^"]+)")+ />~is', $source, $matches, PREG_PATTERN_ORDER);
lijkt me een prima oplossing, maar ff een vraagje: ~ als pattern delimiter? kan dat?

*insert signature here


Acties:
  • 0 Henk 'm!

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

Janoz

Moderator Devschuur®

!litemod

Je kunt (afaik) elk willekeurig teken als patterndelimiter gebruiken. zolang je regexp ermee begint wordt dat als delimiter gezien.

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!

  • FragFrog
  • Registratie: September 2001
  • Laatst online: 09:34
Janoz schreef op donderdag 26 april 2007 @ 12:46:
Je kunt (afaik) elk willekeurig teken als patterndelimiter gebruiken. zolang je regexp ermee begint wordt dat als delimiter gezien.
Zou het? Kan er niet al teveel over vinden.. Mijn persoonlijke favoriete info site hier maakt geen indicatie van restricties wat dat betrefd, dus je zal wel gelijk hebben.. :) Lijkt me evengoed dat je geen special chars als *, ., ^ etc ervoor moet gebruiken though :)

[ Site ] [ twitch ] [ jijbuis ]


Acties:
  • 0 Henk 'm!

  • Spider.007
  • Registratie: December 2000
  • Niet online

Spider.007

* Tetragrammaton

Verwijderd schreef op donderdag 26 april 2007 @ 12:05:
[...]


Even inhakend op bovenstaand voorbeeldje: Die ~ waartussen het pattern staat zijn nieuw voor me. Ook nooit tegengekomen in documentatie her en der. Wat doen die t.o.v. de / en waar is daarover wat te lezen?

[...]
The expression should be enclosed in the delimiters, a forward slash (/), for example. Any character can be used for delimiter as long as it's not alphanumeric or backslash (\). If the delimiter character has to be used in the expression itself, it needs to be escaped by backslash. Since PHP 4.0.4, you can also use Perl-style (), {}, [], and <> matching delimiters. See Pattern Syntax for detailed explanation.
En ik gebruik toevallig altijd de tilde; dan kan ik mijn regexps makkelijk herkennen als ik door de broncode van React blader :P

---
Prozium - The great nepenthe. Opiate of our masses. Glue of our great society. Salve and salvation, it has delivered us from pathos, from sorrow, the deepest chasms of melancholy and hate


Acties:
  • 0 Henk 'm!

  • BikkelZ
  • Registratie: Januari 2000
  • Laatst online: 21-02 08:50

BikkelZ

CMD+Z

Volgens mij moet je gewoon eerst uit je string soep "~<img.*>~" zien te vissen (al je img tags met of zonder / op het einde), en daar dan janboerenfluitjes php over laten fietsen. Doe een explode op de spaties en ga dan ieder element wat dat oplevert testen.

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$parameters = array('src', 'alt');
$counter = 0;
$images = array();
foreach ($gevonden_img_tags as $img_tag)
{
$img_parts = explode(" ", $img_tag);
foreach ($img_parts as $img_part)
{
$param_parts = explode("=". $img_part);
if (in_array($param_part[0], $parameters))
{
$images[$counter][$param_part[0]] = str_replace('"', "", strip_slashes($param_part[1]));
}
}
$count++;
}


+ makkelijk uit te breiden met meer parameters of in te zetten voor andere tags (je kunt in die regexp string $tagname gebruiken)

- strafpunten voor elegantie
- spatie is redelijk arbitrair, wie weet mag je van IE 3.x voor unix wel spaties in de inhoud van parameters gebruiken

[ Voor 20% gewijzigd door BikkelZ op 26-04-2007 13:44 ]

iOS developer


Acties:
  • 0 Henk 'm!

  • aaajeetee
  • Registratie: Augustus 2002
  • Laatst online: 20-09 16:31
Ik dank u allen voor de reacties.

Met bovenstaande tips en stukjes code heb ik het voor elkaar gekregen.
Ik haal eerst alle 'images' uit de tekst en haal daar alle attributen uit op.

De regex-en die ik gebruik:
code:
1
2
3
preg_match_all("/<img (.*)>/", $this->total_description, $matches);
//Uit de 'matches'-array haal ik alleen het 1e element (zie onder), deze heet $image.
preg_match_all('((([a-z]+[\s]?)=[\s]?"([^"]+)")+)', $image, $temp_attributes);


Ze zijn alleen nog wat buggy, want er komen altijd een paar extra array's terug met dingen die ik eigenlijk niet wil, zoals:
De eerste preg_match geeft 2 arrays terug, eentje met de complete img-tag en eentje zónder de <img en > tag.. wel apart :s maar daarvoor heb ik inmiddels een work-around :p


Als iemand de bugs nog ziet/weet te vinden mag hij/zij t melden :)

Nogmaals bedankt.

[ Voor 5% gewijzigd door aaajeetee op 26-04-2007 15:16 ]


Acties:
  • 0 Henk 'm!

  • P.O. Box
  • Registratie: Augustus 2005
  • Niet online
ajt schreef op donderdag 26 april 2007 @ 15:15:
Ik dank u allen voor de reacties.

Met bovenstaande tips en stukjes code heb ik het voor elkaar gekregen.
Ik haal eerst alle 'images' uit de tekst en haal daar alle attributen uit op.

De regex-en die ik gebruik:
code:
1
2
3
preg_match_all("/<img (.*)>/", $this->total_description, $matches);
//Uit de 'matches'-array haal ik alleen het 1e element (zie onder), deze heet $image.
preg_match_all('((([a-z]+[\s]?)=[\s]?"([^"]+)")+)', $image, $temp_attributes);


Ze zijn alleen nog wat buggy, want er komen altijd een paar extra array's terug met dingen die ik eigenlijk niet wil, zoals:
De eerste preg_match geeft 2 arrays terug, eentje met de complete img-tag en eentje zónder de <img en > tag.. wel apart :s maar daarvoor heb ik inmiddels een work-around :p
Het is juist de bedoeling bij preg_match dat je die twee matches krigjt (dus de complete img tag en eentje zonder)... dus geen bug...

Acties:
  • 0 Henk 'm!

  • aaajeetee
  • Registratie: Augustus 2002
  • Laatst online: 20-09 16:31
Edwardvb schreef op donderdag 26 april 2007 @ 15:33:
[...]


Het is juist de bedoeling bij preg_match dat je die twee matches krigjt (dus de complete img tag en eentje zonder)... dus geen bug...
Ok, dan weet ik dat ook weer :)
Waarom doet ie dat eigenlijk?

Acties:
  • 0 Henk 'm!

  • P.O. Box
  • Registratie: Augustus 2005
  • Niet online
omdat je een match wil hebben... dus hij geeft je de match van '<img .... >'....
de stukjes tussen haakjes kun je als een soort van sub-matches zien... dus die krijg je nog eens apart genoemd in de array...

Acties:
  • 0 Henk 'm!

  • Spider.007
  • Registratie: December 2000
  • Niet online

Spider.007

* Tetragrammaton

En nog een opmerking over je regexp:

code:
1
[\s]?

Kan je gewoon schrijven als
code:
1
\s?
hoor; een character class met maar 1 karakter heeft niet zoveel zin :)

---
Prozium - The great nepenthe. Opiate of our masses. Glue of our great society. Salve and salvation, it has delivered us from pathos, from sorrow, the deepest chasms of melancholy and hate

Pagina: 1