Avatar billede acid-head Nybegynder
30. juli 2004 - 17:48 Der er 18 kommentarer og
1 løsning

Reg.Exp.. Skifte ud med funktion..

Jeg har i en string en række forekomster af fx

[prisliste all]
[prisliste 2]
[prisliste 7]

Hvordan udskifter jeg disse forekomster med en funktion.

Ovenstående eksempler ville blive skiftet ud med:

pricelist("all");
pricelist("2");
pricelist("7");

Og det er vigtigt at det ikke bare er teksten pricelist("all"); den bliver erstattet med.. Funktionen skal køres..
Avatar billede coderdk Praktikant
30. juli 2004 - 17:53 #1
Hvad med:

$indhold = preg_replace( "/\[prisliste [^\]]+\]/ig", 'pricelist("\\1");', $indhold );
eval( $indhold );
Avatar billede acid-head Nybegynder
30. juli 2004 - 17:55 #2
Men det virker ikke hvis du fx har en string som denne:

$indhold = "<p>Dette er en test.. Og her kommer prislisten: [prisliste all]</p>";

Virker funktionen også der, så prislisten bare bliver indsat der, via funktionen?
Avatar billede acid-head Nybegynder
30. juli 2004 - 17:58 #3
Den skriver "Unknown modifier 'g'" til din Reg.exp-sætning..
Avatar billede coderdk Praktikant
30. juli 2004 - 17:59 #4
Hmm nej. Prøv med:

$indhold = "<p>Dette er en test.. Og her kommer prislisten: [prisliste all]</p>";
$indhold = preg_replace( "/\[prisliste [^\]]+\]/ige", pricelist("\\1"), $indhold );
Avatar billede coderdk Praktikant
30. juli 2004 - 18:00 #5
Ah bare fjern g'et hvis den opfører sig underligt, så prøv at tilføje et m - altså så der står /im
Avatar billede acid-head Nybegynder
30. juli 2004 - 18:00 #6
Den sletter resten af stringen, men udskriver godt nok prislisten..

Og så skriver den stadig: Unknown modifier 'g' in test.php on line 6 og linie seks er din reg.exp-sætning.
Avatar billede acid-head Nybegynder
30. juli 2004 - 18:01 #7
Da jeg fjernede g'et blev det bedre.. Men nu kommer prislisten først, og så resten af stringen efter.. Altså ikke på sin plads..?
Avatar billede coderdk Praktikant
30. juli 2004 - 18:06 #8
heheh ok, denne burde virke:

    $indhold = "<p>Dette er en test.. Og her kommer prislisten: [prisliste all]</p>";
    $indhold =  preg_replace( "/\[prisliste [^\]]+\]/ie", "pricelist('\\1')", $indhold );

:)
Avatar billede acid-head Nybegynder
30. juli 2004 - 18:08 #9
Hmm.. Narh, ikke helt.. Prislisten kommer slet ikke frem. Altså funktionen køres ikke.. Ligesom om den fjerner pricelist()..
Avatar billede coderdk Praktikant
30. juli 2004 - 18:11 #10
Dette virker for mig:

<?php

    function pricelist( $txt )
    {
        return "dette er produkt 1 koster 255,- og produkt 2 koster 1,-";
    }

    $indhold = "<p>Dette er en test.. Og her kommer prislisten: [prisliste all]</p>";
    echo preg_replace( "/\[prisliste [^\]]+\]/ie", "pricelist('\\1')", $indhold );

?>
Avatar billede coderdk Praktikant
30. juli 2004 - 18:12 #11
Sorry, der VAR en fejl :) Denne virker:

<?php

    function pricelist( $txt )
    {
        return "dette er '$txt' - produkt 1 koster 255,- og produkt 2 koster 1,-";
    }

    $indhold = "<p>Dette er en test.. Og her kommer prislisten: [prisliste all]</p>";
    echo preg_replace( "/\[prisliste ([^\]]+)\]/ie", "pricelist('\\1')", $indhold );

?>
Avatar billede acid-head Nybegynder
30. juli 2004 - 18:17 #12
Hmm.. Virker altså ikke  rigtig for mig.. Den udskriver slet ikke prislisten..

Min pricelist-funktion ser således ud:

function pricelist($id="all")
{
  if ($id == "all")
    $result = mysql_query("SELECT * FROM prisliste_overskrift");
  else
    $result = mysql_query("SELECT * FROM prisliste_overskrift WHERE id = '$id'");


  $antal = mysql_num_rows($result);
  if ($antal > 0)
  {
    $string = "";
    $string .= "<table border=\"0\" cellspacing=\"10\">\n<tr>\n";
    $count = 1;
    while($row = mysql_fetch_array($result))
    {
      $result_items = mysql_query("SELECT * FROM prisliste_items WHERE gruppe = '$row[id]'");
      $antal = mysql_num_rows($result_items);
      if ($antal > 0)
      {
        $string .= "<td valign=\"top\">\n";
        $string .= "<table width=\"200\" border=\"0\">\n<tr>\n<td colspan=\"2\"><b>$row[navn]</b></td>\n</tr>\n";
        while($row_items = mysql_fetch_array($result_items))
        {
          $string .= "<tr>\n<td width=\"80%\" style=\"border-bottom: 1px dotted #000000;\">$row_items[navn]</td>\n<td width=\"20%\" style=\"border-bottom: 1px dotted #000000;\" align=\"right\">$row_items[pris]</td>\n</tr>\n";
        }
        $string .= "</table>\n";
 
        $string .= "</td>\n";
        if ($count%2 == 0)
          $string .= "</tr>\n<tr>\n";
        $count++;
      }
    }
    $string .= "</tr>\n<table>\n";
  }
  return $string;
}
Avatar billede acid-head Nybegynder
30. juli 2004 - 18:18 #13
Okay.. Ekspemplet i din "Sorry der VAR en fejl" virkede perfekt! :)

Mange tak for den hurtige hjælp!
Avatar billede coderdk Praktikant
30. juli 2004 - 18:18 #14
Smid lige den preg_replace kode, du har sikkert ikke taget min sidste ;)
Avatar billede coderdk Praktikant
30. juli 2004 - 18:18 #15
Ah :)
Avatar billede acid-head Nybegynder
30. juli 2004 - 18:19 #16
Hvis du er rigtig sej så forklare du lige hurtig hvad din reg.exp gør, for vil virkelig gerne lære det møj selv.. ;)
Avatar billede coderdk Praktikant
30. juli 2004 - 18:23 #17
echo preg_replace( "/\[prisliste ([^\]]+)\]/ie", "pricelist('\\1')", $indhold );

finder "[prisliste " og gemmer alt indtil det næste "]" i "register 1" (pga at der er () omkring) dette erstatter den med "pricelist('\\1')" hvilket den så fortolker som PHP. /ie er hhv case insensitivity (altså du kan skrive PriSLIsTE) og e er så at den skal evaluere replace strengen som PHP. :)
Avatar billede acid-head Nybegynder
30. juli 2004 - 18:28 #18
Mange tak..

Det er dejligt med hurtig hjælp der bare dur'!
Avatar billede coderdk Praktikant
30. juli 2004 - 18:30 #19
Selvtak :) Det er HELT klart værd at sætte sig ind i PCRE: http://dk2.php.net/PCRE - preg* funktionerne er GULD værd! :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester