preg_replace in ob_start met array items

Status
Niet open voor verdere reacties.

That Guy

Meubilair
Lid geworden
28 nov 2006
Berichten
5.010
Hoi allemaal,

Ik ben lekker bezig met wat geklooi, maar heb nu het volgende probleem. Dit is het idee:
PHP:
<?php

   $testSpul = array();
   $testSpul['iets'] = "string";
   $testSpul['data'] = "0.34";

   ob_start("testfunctie");

   echo "<!--iets-->";

   // html pagina hier

   echo "<!--data-->";

   ob_end_flush();

?>
nu dus de testfunctie(), data uit de comments haalt en er de correcte $testSpul-item invult. Ik had zoiets:
PHP:
function testfunctie($buffer)
{
   return preg_replace("/<!--([\w]+)-->/", $testSpul["$1"], $buffer);
}
maar dat werkt (zoals altijd) niet. Had ook even een preg_match geprobeerd, en dan later met een loopje alles invullen, maar dat werkt ook niet. Iemand een idee waarom?


:thumb:
 
Laatst bewerkt:
dit is uit de help gevist
PHP:
<?php

function callback($buffer)
{
  // replace all the apples with oranges
  return (str_replace("apples", "oranges", $buffer));
}

ob_start("callback");

?>
<html>
<body>
<p>It's like comparing apples to oranges.</p>
</body>
</html>
<?php

ob_end_flush();

?>
Maar str_replace is dan ook mixed dus je kan twee arrays meegeven
maar je moet dan wel de goed volgorde hanteren
PHP:
<?php
// Provides: <body text='black'>
$bodytag = str_replace("%body%", "black", "<body text='%body%'>");

// Provides: Hll Wrld f PHP
$vowels = array("a", "e", "i", "o", "u", "A", "E", "I", "O", "U");
$onlyconsonants = str_replace($vowels, "", "Hello World of PHP");

// Provides: You should eat pizza, beer, and ice cream every day
$phrase  = "You should eat fruits, vegetables, and fiber every day.";
$healthy = array("fruits", "vegetables", "fiber");
$yummy   = array("pizza", "beer", "ice cream");

$newphrase = str_replace($healthy, $yummy, $phrase);

// Use of the count parameter is available as of PHP 5.0.0
$str = str_replace("ll", "", "good golly miss molly!", $count);
echo $count; // 2

// Order of replacement
$str     = "Line 1\nLine 2\rLine 3\r\nLine 4\n";
$order   = array("\r\n", "\n", "\r");
$replace = '<br />';
// Processes \r\n's first so they aren't converted twice.
$newstr = str_replace($order, $replace, $str);

// Outputs: apearpearle pear
$letters = array('a', 'p');
$fruit   = array('apple', 'pear');
$text    = 'a p';
$output  = str_replace($letters, $fruit, $text);
echo $output;
?>
 
Tenzij je hele specifieke redenen hebt om dit zo te doen zou ik eens kijken naar een willekeurige bestaande Template Engine... er zijn er heel veel, en de meeste zijn een stuk eenvoudiger dan deze.

Kijk bijvoorbeeld eens naar Smarty.
 
Hoi,



Het is meer een beetje zelf klooien, experimenteren. Het punt is dat ik de str_replace al wel door had, maar de arrays worden dan erg groot en ik wou dus een kortere, makkelijkere oplossing. Vandaar de preg_replace.

Template engine is dus ook niet handig, het gaat me op het moment vooral om het idee.

Dus, weet iemand waarom mn huidige code nou niet werkt? (vooral het waarom intereseert me)



:thumb:
 
staat deze in de zelfde phpfile of wordt de ander file include of requere ("testfunctie")


maar merk op dat je een functie return t en niet de string in uw geval
(performatie : een functie werkt sneller(niet zichtbaar) als zij is bekent vooraf dus als hij al is gezien in uw geval staat die dan bovenaan de file)
PHP:
function testfunctie($buffer)
{
   return preg_replace("/<!--([\w]+)-->/", $testSpul["$1"], $buffer);
}
in het geval dat in de helpfile werd behandelt gaan zijn iets als een vertaling systeem naarvoorduwen waar ik een ander bouwde
 
Hoi kenikavanbis,

helaas snap ik niets van je post. Zou je je wat duidelijker kunnen uitleggen? De volgorde van het script is zoiets:
PHP:
$testSpul = array();

   $testSpul['iets'] = 'stuff';

   function testfunctie($buffer)
   {
      //functie hier dus
   }

   // <!-- comments -->

   // html pagina

   // <!--iets-->

Ik dacht het te hebben; de $testSpul was niet global natuurlijk, dus ik deed dit:
PHP:
function testfunctie($buffer)
{
   global $testSpul;

   return preg_replace("/<!--([\w]+)-->/", $testSpul["$1"], $buffer);
}
maar het mocht niet baten.
 
Krijg je wel een foutmelding o.i.d.? Of gebeurt er echt niets?
 
Als ik dit doe
PHP:
function testfunctie($buffer)
{
   return preg_replace("/<!--([\w]+)-->/", "$1", $buffer);
}
komt op elke plek waar een comment staat de text tussen die comments. Dus <!--test--> wordt test. Als ik dit doe:
PHP:
function testfunctie($buffer)
{
   global $testSpul;
 
   return preg_replace("/<!--([\w]+)-->/", $testSpul["$1"], $buffer);
}
dan komt er een wit scherm, er is dan ook geen broncode. Ook geen error dus.
 
wat doe je hieronder is dat je een
$testSpul hebt en je neemt een stuk van de array

print_r($testSpul);//hier kijken we naar de array

print $testSpul["$1"];//hier kiezen we één element met onbekende naam uit de varable $1 helaas is die mogelijks null dus die is niet vindbaar dus waarde is hier dan ook null waar als je bovenstaande "$1" to string wordt opgeroepen dus als string wordt weergegeven.(zoals ik de code nu bekijk)

function testfunctie($buffer)
{
global $testSpul;

return preg_replace("/<!--([\w]+)-->/", $testSpul["$1"], $buffer);
}
 
@ kenikavanbis,
ik volg je hele verhaal niet meer. Je kan helemaal niet de $testSupul printen met als index "$1" omdat deze alleen bestaat binnen de regexp. print_r() werkt ook niet, want het is een bufferfunctie (als ik print_r met de 2e parameter true aanroep, krijg ik wel een error message; iets dat je dit niet mag doen in output-bufferingsfuncties.




@ iedereen:
Maargoed, mn vraag is dus nogsteeds, waarom mag ik de regexp. "$1" niet gebruiken als array index? Ik kan me voorstellen dat, omdat deze dynamisch is ofzo (in de preg_replace() functie) hij dit dus niet eet oid, maar kan iemand dit confimen?

Mocht dit dus niet kunnen, heeft iemand een omweg of oplossing dan?




nogmaals bedankt :thumb:
 
Ik wil u effe dit tonen het is niet wat het lijkt ik dacht dat je een variable met getal on maken maar het echter niet zo.
maar een variabele kan wel een getal bezitten. kunt u het verzekeren het een één is en geen l
let op de code is nadien ook wel zeer moeilijk leesbaar achteraf.
PHP:
//TESTEN van array
$testSpul[1]= "één";
$testSpul[2]= "Twee";
$testSpul["$1"]= "dollar één";
$l = 10;
$testSpul["$l"]= "dollar één";
print_r($testSpul);//hier kijken we naar de array
 
Ik heb gisteren ook nog een poos zitten kl*ten, want ik snap ook niet waarom het niet werkt. Toen kwam ik er wel achter dat je ook nog wat kunt met "\\1". Misschien kun jij daar verder nog wat mee?
 
Toch nog een bump,


ben er nogsteeds mee bezig. Ik kan begrijpen dat de "$1" (of "\\1") gezien wordt als string en deze niet als index bestaat van de $testSpul, wat het huidige script dus nutteloos maakt.

Heeft iemand toevallig een idee hoe dit dan wel makkelijker kan (dus niet met 2x een array en str_replace)?



:thumb:
 
Toch nog een bump,


ben er nogsteeds mee bezig. Ik kan begrijpen dat de "$1" (of "\\1") gezien wordt als string en deze niet als index bestaat van de $testSpul, wat het huidige script dus nutteloos maakt.

Heeft iemand toevallig een idee hoe dit dan wel makkelijker kan (dus niet met 2x een array en str_replace)?


Html commentaar laat tekst niet zien .
:thumb:
PHP:
<?php
 
   $testSpul = array();
   $testSpul['iets'] = "string";
   $testSpul['data'] = "0.34";
 
   ob_start("testfunctie");
 
   echo "!--iets-->";
 
   // html pagina hier
 
   echo "!--data-->";
 
   ob_end_flush();



?>
 
Vooruit dan, omdat jij het bent ;):

PHP:
<?php
		
		function testfunctie ( $buffer ) {
			global $testSpul;
			return preg_replace("/<!--([\w]+)-->/e", '$testSpul["$1"]', $buffer);
		}
 
		$testSpul = array();
		$testSpul['iets'] = "string";
		$testSpul['data'] = "0.34";
 
		ob_start("testfunctie");
 
		echo "<!--iets-->";
 
		// html pagina hier
 
		echo "<!--data-->";
 
		ob_end_flush();
 
?>

Doet dat wat je wilt dat het doet?
 
Hoi,


Nope, dat doet het niet. Nu krijg ik in de plek van de html comments, gewoon de string $testSpul['xxx'] te zien. Hey, wat raar, in mn pagina doet ie t n iet, maar de code die die jij gaf werkte wel. Mhh, eventjes testen.


[edit]ZOMG je bent een held. Thanks![/edit]
 
Laatst bewerkt:
Mooi dat het werkt.

Eerlijkheid gebied me wel te zeggen dat ik het niet zelf bedacht heb... heb het gegoogled ;)
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan