[PHP] Preg_replace: functie achterhalen waarde

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • EnsconcE
  • Registratie: Oktober 2001
  • Laatst online: 19-06 00:07
Voor een CMS dat ik aan het maken ben, heb ik een preg_replace met een patterns en een replacements array. Omdat ik de uploads in een database heb staan wil ik deze graag tijdens de preg_replace laten vervangen. Alleen wanneer het bijvoorbeeld een plaatje is zal de input een cijferreeks zijn en de preg_replace dient dmv een functie die de cijferreeks omzet naar een pad verwijzing:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
$input ="een hele lap text met een plaatje [img]1321[/img]";

$patterns[] = "/\[b\](.*)\[\/b\]/U";
$patterns[] = "/\[i\](.*)\[\/i\]/U";
$patterns[] = "/\[u\](.*)\[\/u\]/U";
$patterns[] = "/\[img\]([0-9]+)\[\/img\]/U";

$replacements[] = "<b>\\1</b>";
$replacements[] = "<i>\\1</i>";
$replacements[] = "<u>\\1</u>";
$replacements[] = "<img src=\"files/" . $location('\\1') . "\" alt=\"\" title=\"\" />";

preg_replace($patterns, $replacements, $input);


Het aanroepen van die functie binnen de array lukt niet, wat logisch is. Nu ben ik opzoek naar een eenvoudige logische oplossing. Ik kan ervoor kiezen nogmaals een preg_replace uit te voeren die opzoek gaat naar <img src="([0-9])".... maar persoonlijk gaat mijn voorkeur niet uit naar het tweemaal uitvoeren van een preg_replace. Je moet namelijk de syntax op twee plekken gaan onderhouden.

Wat is een goede oplossing voor dit probleem?

Acties:
  • 0 Henk 'm!

  • MichelVH
  • Registratie: Oktober 2001
  • Laatst online: 16-09 20:54
Kijk eens naar de e-modifier en een voorbeeld van de e-modifier in de manual :)

Don't be afraid of the dark, be afraid of what it hides


Acties:
  • 0 Henk 'm!

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

NMe

Quia Ego Sic Dico.

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

  • EnsconcE
  • Registratie: Oktober 2001
  • Laatst online: 19-06 00:07
Thanks NMe, dit is mijn resultaat:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class MyClass {
    function MyClass() {

    }

    public function bbcode($input) {
        $input = preg_replace_callback("/\[img\]([0-9]+)\[\/img\]/U", array( &$this, "returnFileUploadIdImg"), $input);
        return $input;
    }

    private function returnFileUploadIdImg($matches) {
        global $MyOtherClass;
        return "<img src=\"files/" . $MyOtherClass->location($matches[1]) . "\" alt=\"\" title=\"\" />";
    }
}


array schijn je te moeten gebruiken als het een class betreft, bij mij dus het geval. Het was ook het enige wat werkte, vraag me niet waarom. Misschien dat iemand dat zou willen ophelderen?

Acties:
  • 0 Henk 'm!

  • Patriot
  • Registratie: December 2004
  • Laatst online: 16-09 13:49

Patriot

Fulltime #whatpulsert

In principe moet het ook gewoon in een losse functie kunnen. Je kunt $MyOtherClass ook als reference meegeven aan bbcode(), en dan array($MyOtherClass, "location") doen. Je moet dan wel zorgen dat location het tweede element van de matches array pakt (nu vraagt het nog om een string geloof ik). Kan dat niet, dan moet je met een wrapper aan de slag (wat je nu al doet). De constructie die je nu hebt is in ieder geval niet nodig.

EDIT:
Voorbeeldje:

PHP:
1
2
3
4
5
6
7
function bbcode($input, &$otherClass)
{
  $result = preg_replace_callback("/\[img\]([0-9]+)\[\/img\]/U", array(&$otherClass, "location"), $input);
  return "<img src=\"files/" . $result . "\" alt=\"\" title=\"\" />";
}
// aanroepen doe je zo:
// bbcode($string, $MyOtherClass);


Als je dat gebruikt moet de location-method van die andere klasse wel het tweede element van de array die preg_replace_callback meegeeft nemen. Als dat niet het geval is kun je het ook nog zo doen:

PHP:
1
2
3
4
5
6
7
8
9
10
11
function wrapper($m)
{
 return $m[1];
}

function bbcode($input, &$otherClass)
{
  $result = preg_replace_callback("/\[img\]([0-9]+)\[\/img\]/U", "wrapper", $input);
  return "<img src=\"files/" . $otherClass->location($result) . "\" alt=\"\" title=\"\" />"
}
// aanroepen gaat hetzelfde

[ Voor 50% gewijzigd door Patriot op 21-08-2009 18:51 ]