[php] preg_replace variabele hash table

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Dag Tweakers,

Ik zit met twee lastige problemen, en kom echt niet meer veder.
Het verhaal is in een variable string staat: bal bla tekst [FORM_1] en meer tekst [BLA_1] en misschien en zo [FORM_2]. Nu filter ik alles tussen de blokhaken. Dit zijn functies in het object MACRO. Deze voer ik uit en wil het resultaat vervangen met preg_replace.

Dit is mijn code:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
preg_match_all("/\\[(\w+)\]/", $sBody,$aMacro);

if(!empty($aMacro[1])) {
    foreach($aMacro[1] as $iK => $MACRO) {
        list($sFunc,$iVar) = split("_",$MACRO,2);
        $macroResult[$MACRO] = MACRO::$sFunc($iVar);
        
        # onderstaande code werkt niet :S
        //$sFunc_exists = "MACRO::$sFunc";
        //if (function_exists('MACRO::$sFunc')) {
        //  $sBody .= MACRO::$func_macro($sVars);
        //} else {
        //  $sBody .= "function bestaat niet";
        //}
    }

    $pattern = '/\\[(\w+)\]/';
    $replacement = $macroResult['$1'];
    
    $sBody = preg_replace($pattern, $replacement,$sBody);
}


Probleem 1 is dat preg_replace de hash key variabele niet wil resolven.
Ik denk aan de syntax maar weet niet zeker.

PHP.NET geeft als voorbeeld:

code:
1
2
3
4
5
6
7
8
$string = 'The quick brown fox jumped over the lazy dog.';
$patterns[0] = '/quick/';
$patterns[1] = '/brown/';
$patterns[2] = '/fox/';
$replacements[2] = 'bear';
$replacements[1] = 'black';
$replacements[0] = 'slow';
echo preg_replace($patterns, $replacements, $string);


en

code:
1
2
3
4
$patterns = array ('/(19|20)(\d{2})-(\d{1,2})-(\d{1,2})/',
                   '/^\s*{(\w+)}\s*=/');
$replace = array ('\3/\4/\1\2', '$\1 =');
echo preg_replace($patterns, $replace, '{startDate} = 1999-5-27');


Nu heb ik zoals je kunt zien, niet 2 arrays maar een hash.

$replacement = $macroResult['FORM_1'];
werkt wel maar het zou $macroResult[$var] moeten zijn waarbij $var de hash key is.

Erg lastig om uit te leggen.

Probleem 2 is dat de function_exists niet werkt bij een class. Maar hier kan ik nog verder op zoeken.

Greetz West

[ Voor 18% gewijzigd door Verwijderd op 15-03-2006 17:15 ]


Acties:
  • 0 Henk 'm!

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

NMe

Quia Ego Sic Dico.

PHP:
18
    $replacement = $macroResult['$1'];

Regel 18 kan niet werken, tenzij je een key hebt in je array die letterlijk '$1' heet. Wat jij wil kan volgens mij alleen met een callback. :)

En als je de manualpagina van function_exists eens goed bekijkt dan zie je deze functie. ;)

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

Verwijderd

Topicstarter
Kan niet werken zeg je, maar in het voorbeeld van PHP.NET kan het wel met een array, en in PERL kan het door
code:
1
$parsed =~ s~\\[+(\w+)\]~$headers{$1}~g;

te gebruiken.

Ik geloof namelijk wel dat het kan weet alleen niet hoe.

De method_exists had ik gevonden. Dat werkt inderdaad perfect!

Acties:
  • 0 Henk 'm!

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

NMe

Quia Ego Sic Dico.

En toch kan $array['$1'] niet werken. ;) Ik denk dat je jezelf een hoop tijd bespaart als je even kijkt wat die callback voor je kan doen. :)

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

Verwijderd

Topicstarter
Ik heb 2 oplossingen gevonden, eentje dankzij -NMe- de andere door net zolang te klooien en eigenwijs te zijn :D

Met preg_replace heb ik het opgelost door:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
    function parse_content($sBody=NULL) {
    
        if (empty($sBody)) {
            $sBody = "<p>NO HTML</p>";
        } else {
            preg_match_all("/\\[(\w+)\]/", $sBody,$aMacro);
            
            if(!empty($aMacro[1])) {
                foreach($aMacro[1] as $iK => $MACRO) {
                    list($sFunc,$iVar) = split("_",$MACRO,2);
                    $hMacro[$MACRO] = MACRO::$sFunc($iVar);
                }
                
                foreach($hMacro as $MACRO => $sV) {
                    $sBody = preg_replace("/\\[$MACRO]/", $sV,$sBody);
                }
            }
        }
        return $sBody;
    }


De meer uitgewerkte code is met preg_replace_callback:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
    # --------------------------------------------------------------------------
    # MACRO function call
    function eval_function_replace($aMatches) {
        list($sFunc,$iVar) = split("_",$aMatches[1],2);
        return (is_callable(array(MACRO,$sFunc))) ? (MACRO::$sFunc($iVar)) : ($aMatches[0]);
    }
    
    # --------------------------------------------------------------------------
    # parse MACROS in body
    function parse_content($sBody=NULL) {
        return (!empty($sBody)) ? (preg_replace_callback('/\\[(\w+)\]/', array($this,'eval_function_replace'),$sBody)) : ("<p>NO HTML</p>");
    }


Beide doen hetzelfde (behalve dat methode ook nog controleert of de function in de class bestaat.
Misschien heeft iemand anders er nog wat aan.

Greetz West

Verwijderd

Topicstarter
Het blijft toch vreemd en onlogisch voor mij die reg expression functions in php.

Wat ik nu weer tegen kom is dat ik niet weet hoe ik de static test functie kan aanroepen.
Zoals in de code hier onder werkt het, maar zodra ik de test functie static in de dice class plaats
gaat het fout: Unable to call custom replacement function.

What's that? Syntax?
$sSubscribeForm = preg_replace_callback('/\<pc (\w+)\>/', array('self','test'), $sSubscribeForm); ????

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
function test($matches) {
    $hProfile['sLastName'] = "Value uit de database";
    return (isset($hProfile[$matches[1]])) ? ($hProfile[$matches[1]]) : "";
}

class dice {

   public static function subscribe() {
      $sSubscribeForm = file_get_contents(TEMPL_DIR."/subscribe.templ.php");
      $sSubscribeForm = preg_replace_callback('/\<pc (\w+)\>/', 'test', $sSubscribeForm);
   }

}


I don't know.

Verwijderd

Topicstarter
Verwijderd schreef op woensdag 20 september 2006 @ 12:43:
Het blijft toch vreemd en onlogisch voor mij die reg expression functions in php.

Wat ik nu weer tegen kom is dat ik niet weet hoe ik de static test functie....
I don't know.
Het werkt dus wel 8)7 Als de subscribe functie ook static is zoals ik wel in mijn voorbeeld heb
geschreven. Weet nog niet waarom dat zo zou moeten maar het werkt.

Toch is perl een stuk krachtiger met:
Perl:
1
$parsed =~ s~\\[+(\w+)\]~$headers{$1}~g;

Dit zou PHP toch ook zo moeten kunnen lijkt me?

Verwijderd

Topicstarter
dus... na lange tijd... toch de syntax kunnen vinden. Komt ie...

PHP:
1
preg_replace('/<pc (\w+)>/e', "\$hRefs['$1']", $sTemplate );


Waarbij $hRefs de array is met tags die overeen komen met de gevonden tags in de template!


Thanks O+ West _/-\o_ ;)
Pagina: 1