preg_replace vraag

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik heb een vraagje.

In mijn php cms systeem kunnen mensen plaatjes uploaden. Je kent het wel, rechtstreeks van de camera zo 2 mb aan foto's die daarna in de fck editor vlink terug geschaald worden. Eerst had ik hier een upload resize script voor gemaakt maar dan beschik je niet meer over de hoge resolutie versie.

Nu wil ik eigenlijk het plaatje opnieuw laten tekenen met php voor de bezoekers kant. Maar hiervoor moet ik de in mysql opgeslagen img tag omvormen..

met andere woorde, dit:
<img height="3456" width="2304" src="org1268775684.jpg" alt="" />

moet worden
<img src="paginas/phpimage.php?filename=org1268775684.jpg&width=3456&height=2304"/>

Ik wil dit doen met preg_replace, maar krijg het niet voor elkaar ook de height en width uit de img tag te halen. Zit nu al 2 avonden de kloten maar komt niet verder dan dit.

PHP:
1
$text = preg_replace('#<p>.+?src=[\'"]([^\'"]+)[\'"].*</p>#i', "<img src=\"paginas/phpimage.php?filename=..$1&width=??&height=??\"/>", $text);


kan iemand mij een hint geven?? word moedeloos... :(

Acties:
  • 0 Henk 'm!

  • CyBeR
  • Registratie: September 2001
  • Niet online

CyBeR

💩

Dit niet met regexps doen maar een XML of SGML parser.

All my posts are provided as-is. They come with NO WARRANTY at all.


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
CyBeR schreef op dinsdag 22 juni 2010 @ 22:58:
Dit niet met regexps doen maar een XML of SGML parser.
Juist. * RobIII nog even verwijst naar Creepy's sig.

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!

  • icyx
  • Registratie: Januari 2007
  • Niet online

icyx

chown -R us ./base

Now we have one less :+

code:
1
2
kevin@iusaaset:/tmp$ cat bsdesign_regex | perl -pe 's/.*?"(\d{1,4})".*?"(\d{1,4})".*?"([\w.]*)"?.*/\<img\ src="paginas\/phpimage.php\?filename=\3&width=\1&height=\2"\/\>/'
<img src="paginas/phpimage.php?filename=org1268775684.jpg&width=3456&height=2304"/>

When you think you’ve succeeded / but something’s missing / means you have been defeated / by greed, your weakness.


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
hmm. hier snap ik niet zo veel van.. ben bang dat dit nog een paar avondjes hoofdpijn zal verzorgen.

Acties:
  • 0 Henk 'm!

  • pieturp
  • Registratie: April 2004
  • Laatst online: 18-09 15:56

pieturp

gaffa!

Je kunt natuurlijk ook je URL's rewriten:

<img src="http://domein.ext/paginas/imageresizer/originalfile/width/height">

Er is genoeg over rewriting van URL's te vinden ;)

... en etcetera en zo


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
pieturp schreef op woensdag 23 juni 2010 @ 00:01:
Je kunt natuurlijk ook je URL's rewriten:

<img src="http://domein.ext/paginas/imageresizer/originalfile/width/height">

Er is genoeg over rewriting van URL's te vinden ;)
En hoe lost dat zijn probleem op? Hij zal nog steeds de width/height/filename uit de string moeten peuteren :?
Lesson learnt: Sla geen HTML op, sla width/height/filename op in 3 losse velden in een record in een tabel.

[ Voor 12% gewijzigd door RobIII op 23-06-2010 00:05 ]

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!

  • DataGhost
  • Registratie: Augustus 2003
  • Laatst online: 19-09 21:26

DataGhost

iPL dev

Daarbij nog even de kanttekening dat je nu dus voor elke request opnieuw een plaatje gaat genereren. Ik zou er rekening mee houden dat de server waar het geheel op moet draaien hard over z'n nek gaat als je meer dan twee bezoekers per dag hebt. Bedenk je daarbij ook dat iedereen steeds hetzelfde te zien krijgt dus dat het on-the-fly genereren compleet geen meerwaarde heeft. Je kan het resultaat van het scalen ergens cachen en dat direct serveren.

Acties:
  • 0 Henk 'm!

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

NMe

Quia Ego Sic Dico.

DataGhost schreef op woensdag 23 juni 2010 @ 00:16:
Daarbij nog even de kanttekening dat je nu dus voor elke request opnieuw een plaatje gaat genereren. Ik zou er rekening mee houden dat de server waar het geheel op moet draaien hard over z'n nek gaat als je meer dan twee bezoekers per dag hebt. Bedenk je daarbij ook dat iedereen steeds hetzelfde te zien krijgt dus dat het on-the-fly genereren compleet geen meerwaarde heeft. Je kan het resultaat van het scalen ergens cachen en dat direct serveren.
Wie zegt dat 'ie dat niet al doet? ;)

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

  • pieturp
  • Registratie: April 2004
  • Laatst online: 18-09 15:56

pieturp

gaffa!

RobIII schreef op woensdag 23 juni 2010 @ 00:04:
[...]

En hoe lost dat zijn probleem op? Hij zal nog steeds de width/height/filename uit de string moeten peuteren :?
Lesson learnt: Sla geen HTML op, sla width/height/filename op in 3 losse velden in een record in een tabel.
Oeps! Zat andersom te redeneren 8)7

... en etcetera en zo


Acties:
  • 0 Henk 'm!

  • icyx
  • Registratie: Januari 2007
  • Niet online

icyx

chown -R us ./base

Verwijderd schreef op dinsdag 22 juni 2010 @ 23:32:
hmm. hier snap ik niet zo veel van.. ben bang dat dit nog een paar avondjes hoofdpijn zal verzorgen.
Ok, kijk:
code:
1
2
3
<img height="3456" width="2304" src="org1268775684.jpg" alt="" />
kevin@iusaaset:/tmp$ cat bsdesign_regex | perl -pe 's/.*?"(\d{1,4})".*?"(\d{1,4})".*?"([\w.]*)"?.*/\<img\ src="paginas\/phpimage.php\?filename=\3&width=\1&height=\2"\/\>/'
<img src="paginas/phpimage.php?filename=org1268775684.jpg&width=3456&height=2304"/>


We hebben dus qua matching het volgende:
code:
1
.*?"(\d{1,4})".*?"(\d{1,4})".*?"([\w.]*)"?.*

De rest van de perl oneliner is gewoon je string printen in combinatie met de drie gematchte variabelen binnen de ()'s. Om je de regex uit te legen zal ik het in drie delen splitsen, een deel per 'onderwerp' om te matchen. Ik stel deze stukken voor:
code:
1
.*?"(\d{1,4})"   <scheiding>   .*?"(\d{1,4})"   <scheiding>   .*?"([\w.]*)"?.*
  1. code:
    1
    
    .*?"(\d{1,4})"

    Als eerste matchen we ieder karakter, 0 of meerdere keren, totdat we een " tegenkomen. Door het vraagteken na de * is dit niet greedy. Vervolgens komt het stuk wat we 'willen onthouden', tussen de ()'s. Hier matchen we een digit (\d is perl, maar gelijk aan [0-9]) die 1-4 cijfers lang is. Daarna matchen we weer het leesteken ".
  2. Deel twee is exact hetzelfde als hierboven.
  3. code:
    1
    
    .*?"([\w.]*)"?.*

    Nu matchen we weer ieder karakter 0 - n keer, ungreedy, totdat we de " tegenkomen. Daarna matchen we 0 - n keer de \w group en de . (leesteken, niet metacharacter). Dit doen we tot de " (leesteken). Nu hebben we dus de filename gematcht, en kunnen we met .* de rest van de string negeren. De \w group is weer perl, en staat gelijk aan [a-zA-Z0-9_].
Verder verwijs ik je door naar de bijbehoorden literatuur van regex's en Automata Theory (als je de achterliggende werking wilt weten).

When you think you’ve succeeded / but something’s missing / means you have been defeated / by greed, your weakness.


Acties:
  • 0 Henk 'm!

  • CyBeR
  • Registratie: September 2001
  • Niet online

CyBeR

💩

code:
1
2
$ echo '<img src="org1234.jpg" height="3456" width="2304" alt="alttext" />' | perl -pe 's/.*?"(\d{1,4})".*?"(\d{1,4})".*?"([\w.]*)"?.*/\<img\ src="paginas\/phpimage.php\?filename=\3&width=\1&height=\2"\/\>/'
<img src="paginas/phpimage.php?filename=alttext&width=3456&height=2304"/>


Uhoh.

All my posts are provided as-is. They come with NO WARRANTY at all.


Acties:
  • 0 Henk 'm!

  • icyx
  • Registratie: Januari 2007
  • Niet online

icyx

chown -R us ./base

CyBeR schreef op woensdag 23 juni 2010 @ 21:06:
code:
1
2
$ echo '<img src="org1234.jpg" height="3456" width="2304" alt="alttext" />' | perl -pe 's/.*?"(\d{1,4})".*?"(\d{1,4})".*?"([\w.]*)"?.*/\<img\ src="paginas\/phpimage.php\?filename=\3&width=\1&height=\2"\/\>/'
<img src="paginas/phpimage.php?filename=alttext&width=3456&height=2304"/>


Uhoh.
Jup, ik houd geen rekening met een andere structuur van de input text. TS gaf een string, en die werd goed geparsed. Dat het met input niet werkt, tsja :+

When you think you’ve succeeded / but something’s missing / means you have been defeated / by greed, your weakness.


Acties:
  • 0 Henk 'm!

  • Gomez12
  • Registratie: Maart 2001
  • Laatst online: 17-10-2023
icyx schreef op woensdag 23 juni 2010 @ 21:35:
[...]

Jup, ik houd geen rekening met een andere structuur van de input text. TS gaf een string, en die werd goed geparsed. Dat het met input niet werkt, tsja :+
Toch is dat zo ongeveer wel de hoofdreden dat er wordt aangeraden om het niet met regexen op te lossen, maar met andere tools. De input is namelijk niet "regular", het kan zo lijken maar vanwege de structuur van html etc is het niet "regular".

Acties:
  • 0 Henk 'm!

  • CyBeR
  • Registratie: September 2001
  • Niet online

CyBeR

💩

icyx schreef op woensdag 23 juni 2010 @ 21:35:
[...]

Jup, ik houd geen rekening met een andere structuur van de input text. TS gaf een string, en die werd goed geparsed. Dat het met input niet werkt, tsja :+
Mja, dat snap ik maar daarom moet je dus geen XML of SGML met een regexp gaan zitten parsen ;)

All my posts are provided as-is. They come with NO WARRANTY at all.


Acties:
  • 0 Henk 'm!

  • icyx
  • Registratie: Januari 2007
  • Niet online

icyx

chown -R us ./base

Jongens, ik begrijp jullie wel, hence the :+. De reden dat ik de regex heb neergezet was natuurlijk om de post van RobIII. En de uitleg erover, tsja, de TS begint over een regex, en begreep de mijne niet. Vandaar een goede daad voor de mensheid, en wat uitleg erbij ;)
Maar inderdaad, een fatsoenlijke parser is bij dit soort taken geen overbodige luxe.

When you think you’ve succeeded / but something’s missing / means you have been defeated / by greed, your weakness.


Acties:
  • 0 Henk 'm!

Verwijderd

De oplossing mét DOM zoals het hoort... lijvig maar correct :D

<?php
$dd = new DOMDocument();
$imgE = String2DOMElement($dd, '<img height="3456" width="2304" src="org1268775684.jpg" alt="" />');
$newImgE = $dd->createElement('img');

$newSrc = 'paginas/phpimage.php';
$temp = '';
$getParams = array();
if(($temp = $imgE->getAttribute('src')))
{
	$getParams[] = 'filename=' . $temp; 
}
if(($temp = $imgE->getAttribute('width')))
{
	$getParams[] = 'width=' . $temp;
}
if(($temp = $imgE->getAttribute('height')))
{
	$getParams[] = 'height=' . $temp;	
}

$newSrc .= '?' . implode('&', $getParams);
$newImgE->setAttribute('src', $newSrc);

print $dd->saveXML($newImgE);

function String2DOMElement($dd, $string)
{
	$dd->loadHTML('<html><body>' . $string . '</body></html>');
	return $dd->childNodes->item(1)->childNodes->item(0)->childNodes->item(0);
}
?>

Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Laatst online: 00:44

crisp

Devver

Pixelated

Och, regexpen om HTML te parsen; als je uit kan gaan van redelijk valide HTML is er op zich niets mis mee om eerst met een /<img[^>]*>/i alle image-tags uit te filteren en daarbinnen vervolgens weer te zoeken naar bepaalde attributen :)

Intentionally left blank

Pagina: 1