[php]Variable opnemen in preg_replace

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Coen Rosdorff
  • Registratie: Januari 2000
  • Niet online
Ik heb voor een cms/nieuwsmodule achtig systeem een backend gebouwd inclusief de mogelijkheid om meerdere foto's te uploaden.

Deze foto's kunnen met een bbcode-style tag [foto=X] (Waarbij X het nummer van de foto is) gebruikt worden in de tekst. Als je in de output op de foto clickt krijg je foto groter in een popup te zien. Werkt allemaal goed.

Nu heeft de grafisch ontwerper echter bedacht dat het wel fijn is om ook onder de kleine versie in de tekst het onderschrift bij de foto te zien. (Danwel via title/alt, of via een onderschrift in een table om de foto heen). Het ophalen van de onderschriften van alle foto's die mogelijk in het artikel voorkomen (foto's zijn vast gekoppeld aan een artikel) is geen probleem. Preg_replace begint echter wat lastig te doen als ik die teksten ook wil gaan gebruiken.

Ik heb de code voor het gemak even bewerkt tot een kleine testcase. Alles wat goed werkt heb ik hier dus weggelaten.

deze code geeft de volgende error melding:
code:
1
2
Parse error: parse error, expecting `T_STRING' or `T_VARIABLE' or 
`T_NUM_STRING' in replace_test.php on line 8


PHP:
1
2
3
4
5
6
7
8
9
10
11
12
<?php

$alt_txt = array("foto1","foto2","foto3","foto4","foto5");

$string = "test tekst met 2 fotos [foto=1] bla bla [foto=2]";

$pattern[0] = '/\[foto=(\d+)]/i';
$replacement[0] = " [img]\"foto.php?foto=$1\"[/img]";

$string1 = preg_replace($pattern, $replacement, $string);

?>
Error opzich is wel te begrijpen. Ik zie echter even geen workarround om toch tot het gewenste resultaat te komen? Iemand een idee?

Acties:
  • 0 Henk 'm!

  • DR
  • Registratie: December 2000
  • Niet online

DR

PHP:
1
$replacement[0] = " [img]\"foto.php?foto=$1\"[/img]";

[ Voor 31% gewijzigd door DR op 06-08-2004 03:58 ]


Acties:
  • 0 Henk 'm!

  • Coen Rosdorff
  • Registratie: Januari 2000
  • Niet online
Corrado schreef op 06 augustus 2004 @ 03:58:
PHP:
1
$replacement[0] = " [img]\"foto.php?foto=$1\"[/img]";
Lost wel de error op, maar geeft een lege alt-tag. Ook zonder de spaties binnen de blokhaken.

Acties:
  • 0 Henk 'm!

  • DR
  • Registratie: December 2000
  • Niet online

DR

little_soundman schreef op 06 augustus 2004 @ 04:03:
[...]

Lost wel de error op, maar geeft een lege alt-tag. Ook zonder de spaties binnen de blokhaken.
hmmm mjah *slaat zichzelf* :X

Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Laatst online: 15:29

crisp

Devver

Pixelated

of zo:
PHP:
1
2
3
4
5
6
7
8
$alt_txt = array('foto1','foto2','foto3','foto4','foto5'); 

$string = 'test tekst met 2 fotos [foto=1] bla bla [foto=2]'; 

$pattern = '/\[foto=(\d+)]/ie'; 
$replacement = '\'<img title="\' . \$alt_txt[$1] . \'" border="1" src="foto.php?foto=$1">\';'; 

$string1 = preg_replace($pattern, $replacement, $string);

of met _callback:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
$string = 'test tekst met 2 fotos [foto=1] bla bla [foto=2]'; 

$pattern = '/\[foto=(\d+)]/i'; 

$string1 = preg_replace_callback($pattern, 'tag_foto', $string);

function tag_foto($matches) {

  $alt_txt = array('foto1','foto2','foto3','foto4','foto5'); 

  return ' <img title="' . $alt_txt[$matches[1]] . '" border="1" src="foto.php?foto=' . $matches[1] . '">';

}


en let op: je moet het title attribuut gebruiken, alt is niet bedoelt voor een tooltip.

[ Voor 3% gewijzigd door crisp op 06-08-2004 07:04 ]

Intentionally left blank


Acties:
  • 0 Henk 'm!

  • Coen Rosdorff
  • Registratie: Januari 2000
  • Niet online
crisp schreef op 06 augustus 2004 @ 07:01:
of zo:
PHP:
1
2
3
$pattern = '/\[foto=(\d+)]/ie'; 
$replacement = '\'<img title="\' . \$alt_txt[$1] . \'" border="1" 
src="foto.php?foto=$1">\';';
Mja, hier zou ik dus niet opgekomen zijn. Bedankt Crisp.
Ik heb een soort haat/liefde verhouding met regexen. Maar meeste van de tijd is het haat :)
en let op: je moet het title attribuut gebruiken, alt is niet bedoelt voor een tooltip.
Het onderschrift komt dmv een table onder de foto te staan. Alt/title-tag zal waarschijnlijk iets worden als "klik voor een vergroting".

Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Laatst online: 15:29

crisp

Devver

Pixelated

little_soundman schreef op 07 augustus 2004 @ 02:26:
[...]

Mja, hier zou ik dus niet opgekomen zijn. Bedankt Crisp.
Ik heb een soort haat/liefde verhouding met regexen. Maar meeste van de tijd is het haat :)
als je ingewikkeldere dingen wilt gaan doen (bijvoorbeeld de onderschriften bij de foto's apart ophalen uit een DB), dan heeft de _callback manier de voorkeur; daarbij is het ook duidelijker, en de eval-manier haalt nog wel eens rare dingen uit met quotes (maar attributen moet je eigenlijk toch door htmlspecialchars/htmlentities heenhalen).
[...]

Het onderschrift komt dmv een table onder de foto te staan. Alt/title-tag zal waarschijnlijk iets worden als "klik voor een vergroting".
voor een tekst als "klik voor een vergroting" zou ik het title attribuut gebruiken, alt is bedoelt als een alternatieve tekst voor als de foto niet afgebeeld kan worden (bijvoorbeeld in textreaders) - non-IE browsers maken van een alt-text dan ook geen tooltip:
HTML:
1
<img src="poesje.jpg" alt="foto van mijn poes" title="klik voor een vergroting" />

[ Voor 15% gewijzigd door crisp op 07-08-2004 11:39 ]

Intentionally left blank

Pagina: 1