[PHP/Regex] Image src uitlezen

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Reveller
  • Registratie: Augustus 2002
  • Laatst online: 05-12-2022
Ik ben absoluut niet sterk in regex'en. Momenteel probeer ik een regex te schrijven die $text scant op alle image tags en daar de src van uitleest. Tenslotte wil ik uit de src het pad en de naam van het plaatje filteren:
PHP:
1
2
3
4
5
6
7
8
9
$regex = "/<IMG[^>](.*?)>/miU";

$text = 'Een tekst met een <img src="icons/edit.png"> image tag en 
         <img alt="test" src="hier/dit.jpg"> en een 
         <IMG src="images/gek/gisteren/iets.png"> plaatje.';

preg_match_all($regex, $text, $matches);

print_r($matches);

Dit geeft als resultaat:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
Array (
  [0] => Array (
      [0] => <img src="icons/edit.png">
      [1] => <img alt="test" src="dit.jpg">
      [2] => <IMG src="images/gek/gisteren/iets.png">
  )

  [1] => Array (
      [0] => src="icons/edit.png"
      [1] => alt="test" src="dit.jpg"
      [2] => src="images/gek/gisteren/iets.png"
  )
)

Ik wil echter:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Array (
  [0] => Array (
      [0] => <img src="icons/edit.png">
      [1] => icons/
      [2] => edit.png
  )

  [1] => Array (
      [0] => <img alt="test" src="dit.jpg">
      [1] => 
      [2] => dit.jpg
  )

  [2] => Array (
      [0] => <IMG src="images/gek/gisteren/iets.png">
      [1] => images/gek/gisteren/
      [2] => iets.png
  )
)

Kan iemand mij op weg helpen? Ik heb al uitgebreid van Google gezocht, maar heb niets kunnen vinden dat mij verder helpt :|

"Real software engineers work from 9 to 5, because that is the way the job is described in the formal spec. Working late would feel like using an undocumented external procedure."


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 11-06 00:38

NMe

Quia Ego Sic Dico.

Lookaheads?

PHP:
1
$regex = "/<IMG(?!src)src\s*=\s*['\"]?(.*?)['\"]?.*\/?>/miU";

'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.


Acties:
  • 0 Henk 'm!

  • Gomez12
  • Registratie: Maart 2001
  • Laatst online: 17-10-2023
Dus voor je 0 ga je goed.
Voor je 1 zou je moeten zoeken naar src=" als begin en als einde de laatste / binnen degene die je uit 0 haalt.
Voor 2 zou je moeten zoeken naar laatste / als begin en als einde "> binnen hetgene je uit 0 krijgt.

Regexen ben ik ook niet goed in, maar volgens mij heb je 3 regexen nodig omdat je 3 dingen zoekt. Of 1 regex die een stuk uitgebreider is.

Acties:
  • 0 Henk 'm!

Anoniem: 26306

PHP:
1
$regex = '~<img[^>]*\s+src\s*=\s*[\'"]?([^\'">]*?/)?([^\'"/>]+)[\'"]?(?: [^>]+)*\/?>~mi';

Komt al meer in de buurt. Ik heb overigens een hekel aan de U modifier. De i ook, maar in gevallen als deze komt hij wel van pas.
Denk er gewoon aan dat in een tag geen > kan voorkomen, en in een attribute value geen ' " of >

Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Laatst online: 22:51

crisp

Devver

Pixelated

Persoonlijk zou ik dit niet in 1 regexp doen maar gewoon eerst alle img-elementen matchen inclusief attributen en vandaaruit per element de attributen uitfilteren en vervolgens pas iets met de waarde van het src-attribuut doen.
Ten eerste is dat qua code veel duidelijker en beter onderhoudbaar dan een monster van een reguliere expressie, en ten tweede is het waarschijnlijk nog sneller ook.

Overigens Cheatah: je hebt gelijk dat een >-teken niet unencoded binnen een tag mag voorkomen, maar wie zegt dat je input altijd valid HTML is*? Een attribuutwaarde kan aan de andere kant wel degelijk een unencoded single quote bevatten (mits enclosed in double quotes).

* sterker nog: HTML heeft een obscure SGML feature genaamd SHORTTAG waarbij een tag ook met een / afgesloten kan worden; ook al is er geen enkele browser die het ondersteund, dit is wel valid HTML:
HTML:
1
<img src="blaat.gif"/
;)

[ Voor 15% gewijzigd door crisp op 02-10-2006 08:31 ]

Intentionally left blank


Acties:
  • 0 Henk 'm!

Anoniem: 26306

Klopt. Maar ik ga er even niet van uit dat de input incorrect is, en ik ben het overigens ook wel met je eens dat het opdelen in stappen soms makkelijker is. Maar als je uitgaat van real-life situaties zal mijn regex de meeste gevallen wel dekken, gok ik. En het blijft natuurlijk maar een zetje in de juiste richting. Je kunt er ideeën mee opdoen en die oscure SGML features heb ik maling aan ;)

Acties:
  • 0 Henk 'm!

  • Reveller
  • Registratie: Augustus 2002
  • Laatst online: 05-12-2022
@Cheatah - bedankt! Ik ga deze regex testen en kijken welke matches hij eventueel niet maakt.

@crisp - ik wil deze regex in mijn site gebruiken om te kijken welke op de site opgeslagen plaatjes er in een artikel gebruikt worden. Als iemand dan dat plaatje tracht te verwijderen van de server, kan ik een 'plaatje is in gebruik bij artikel 232 en 5353'-alert geven. Als er geen valid HTML ingetikt wordt bij het artikel, wordt het plaatje niet weergeven en dus niet gebruikt. Ik denk niet dat je met alle eventualiteiten rekening kunt houden. Als iemand een stukje javascript in z'n artikel gebruikt (wat mogelijk is) waarlangs hij bv. plaatjes in divs laadt, is er toch geen manier om dat uit te lezen. Het is dus een basale check voor de 95% van de gevallen dat een plaatje via een geldige img-tag ingeladen wordt. Graag je reaktie :)

"Real software engineers work from 9 to 5, because that is the way the job is described in the formal spec. Working late would feel like using an undocumented external procedure."


Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Laatst online: 22:51

crisp

Devver

Pixelated

In dat geval zou ik een tabel aanleggen waarin je bij het aanmaken van een artikel opslaat welke plaatjes erin gebruikt worden. Bij het verwijderen van een plaatje hoef je dan enkel maar even in die tabel te prikken en niet tig artikelen door te gaan spitten ;)

Intentionally left blank


Acties:
  • 0 Henk 'm!

  • Reveller
  • Registratie: Augustus 2002
  • Laatst online: 05-12-2022
crisp schreef op maandag 02 oktober 2006 @ 09:44:
In dat geval zou ik een tabel aanleggen waarin je bij het aanmaken van een artikel opslaat welke plaatjes erin gebruikt worden. Bij het verwijderen van een plaatje hoef je dan enkel maar even in die tabel te prikken en niet tig artikelen door te gaan spitten ;)
Misschien ben ik wat onduidelijk, maar ik bedoelde ongeveer hetzelfde :+

"Real software engineers work from 9 to 5, because that is the way the job is described in the formal spec. Working late would feel like using an undocumented external procedure."


Acties:
  • 0 Henk 'm!

  • xces
  • Registratie: Juli 2001
  • Laatst online: 13-06 12:47

xces

To got or not to got..

Reveller schreef op maandag 02 oktober 2006 @ 09:36:
@crisp - ik wil deze regex in mijn site gebruiken om te kijken welke op de site opgeslagen plaatjes er in een artikel gebruikt worden. Als iemand dan dat plaatje tracht te verwijderen van de server, kan ik een 'plaatje is in gebruik bij artikel 232 en 5353'-alert geven.
Je weet de naam van het plaatje, en je weet waarschijnlijk ook het "pad" waar het plaatje staat. Als het in een database staat zou je een query kunnen doen met een LIKE statement erin, zonder dat je dus eerst "alle" artikelen moet doorlopen... Ideetje?
Pagina: 1