[php] Regular expression replace value direct uit array

Pagina: 1
Acties:

Onderwerpen


Verwijderd

Topicstarter
Beste Tweakers,

Perl is oppermachtig met regular expressions (moest ik even zeggen van mijn Perl-Script collega).
Maarja PHP is heel goed in kopieren van sterke delen van andere talen.

Dus...

Nu mijn vraag: ik wil het voorelkaar krijgen dat ik uit een string die <pc naam> en <pc achternaam> kan vervangen door $array['naam'] = "joop"; en vervangen door $array['achternaam'] = "vriezekoop";

In perl doe je dit zo:
Perl:
1
$parsed =~ s~\\<pc (\w+)\>~$headers{$1}~g;


In php heb ik een code die veel te complex is geworden voor deze aktie.
PHP:
1
$sSubscribeForm = preg_replace_callback('/\<pc (\w+)\>/', array('self','profile_replace_values'), $sSubscribeForm);

of
PHP:
1
2
preg_match_all('/\<pc (\w+)\>/', $sSubscribeForm, $aMatches, PREG_PATTERN_ORDER);
// en dan de array matches in een functie stoppen die dan weer preg_replace of str_replace moet uitvoeren


Kortom waar ik dus op zoek naar ben is, hoe ik de gevonden value $1 kan vervangen door $array['$1']
Iemand die weet hoe dit wel moet???

thanks

[ Voor 4% gewijzigd door Verwijderd op 21-09-2006 16:48 ]


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

NMe

Quia Ego Sic Dico.

Hoe kun je preg_replace_callback überhaupt aanhalen zonder een callbackfunctie? Hoe ziet die functie eruit?

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


Verwijderd

Topicstarter
PHP:
1
2
3
4
        $sQ = "SELECT * FROM t_contact";
        self::$hObj['dbh']->do_query($sQ);
        $aFieldName= self::$hObj['dbh']->get_field_names();
        return (isset($aFieldName[$matches[1]])) ? ($aFieldName[$matches[1]]) : "";


De functie waarna ik op zoek ben hoeft alleen de gevonden value $1 te vervangen door $array['$1']

[ Voor 18% gewijzigd door Verwijderd op 21-09-2006 16:52 ]


  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

quick en dirty:
PHP:
1
$string = preg_replace('/<pc (\w+)>/e', '$array[\'$1\']', $string);

maar een callback functie is wel netter want dan kan je ook afvangen wanneer $array[$1] niet bestaat:
PHP:
1
2
3
4
5
6
7
8
9
10
11
$string = preg_replace_callback('/<pc (\w+)>/', 'callback', $string);

function callback($match)
{
    $array = array( 'naam' => 'joop', 'achternaam' => 'vriezekoop' );

    if (isset($array[$match[1]]))
        return $array[$match[1]];
    else
        return $match[0];
}

Intentionally left blank


Verwijderd

Topicstarter
Hmmm en die callback is een eval functie. Mijn collega lacht me uit :(

En
PHP:
1
$sSubscribeForm = preg_replace('/\<pc (\w+)\>/', '$hProfile[\'$1\']', $sSubscribeForm);


gaat ook niet werken, het ziet $hProfile['sLastName'] niet als var maar als string

[ Voor 58% gewijzigd door Verwijderd op 21-09-2006 17:07 ]


Verwijderd

Topicstarter
kortom ik moet het hier mee doen????

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class dice {

    /* --------------------------------------------------------------------------
    /* get returned values from db  */      
    public static function profile_replace_values($matches) {
        $sQ = "SELECT * FROM t_contact";
        self::$hObj['dbh']->do_query($sQ);
        $hProfile= self::$hObj['dbh']->get_field_names();
        return (isset($hProfile[$matches[1]])) ? ($hProfile[$matches[1]]) : "";
    }
    
    /* --------------------------------------------------------------------------
    /* profile form */      
    public static function SUBSCRIBE($sVar = NULL) {
        # templ form
        $sSubscribeForm = file_get_contents(TEMPL_DIR."/subscribe.templ.php");
        # replace <pc value> with fieldname value in db
        $sSubscribeForm = preg_replace_callback('/\<pc (\w+)\>/', array('self','profile_replace_values'), $sSubscribeForm);
        
        return $sSubscribeForm;
    }
}

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

NMe

Quia Ego Sic Dico.

Dat je collega je uitlacht zegt meer over hem dan over PHP. Perl is namelijk een van de weinige talen die dit soort dingen native kan. Ik zie verder ook niet wat er mis zou zijn met een callback. Nu heb je tenminste controle over je input. ;)

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

  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

Een callback is zeker geen eval. Mag ik nu je collega uitlachen? ;)

Intentionally left blank


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Waarom staat de callback functie dan tussen quotes?

Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

Verwijderd schreef op vrijdag 22 september 2006 @ 09:44:
Waarom staat de callback functie dan tussen quotes?
Omdat PHP geen function-pointers kent?

Intentionally left blank

Pagina: 1