php.de

Zurück   php.de > Webentwicklung > PHP Einsteiger > PHP Tipps 2006

 
 
LinkBack Themen-Optionen Thema bewerten
Alt 08.07.2006, 03:12  
Erfahrener Benutzer
 
Registriert seit: 21.05.2008
Beiträge: 9.937
Zergling-new wird schon bald berühmt werden
Standard preg_replace(_callback)

Hallo,

ich bin gerade etwas am verhungern mit meinem Problem.
In der Datenbank habe ich folgende Einträge:
Code:
id | lastname | firstname | nickname | showname
1 | Grabowski | NULL | Kalle | %nickname %lastname
2 | NULL | NULL | Ratte | NULL
3 | Kampmann | Mark | NULL | %firstname %lastname
Mein Ziel ist es gerade, die %platzhalter durch ihren Spaltenwert zu ersetzen (in PHP).
Dabei will ich nicht harcodet reinschreiben, welche Spaltentypen da sein könnten, sondern das in etwa so lösen:

PHP-Code:
<?php
function showname($profile)
{
    if (isset(
$profile->showname)) {
        return 
preg_replace(
            
'#%([a-z_]+)#is',
            
"showname_callback(\$profile, '\\1')",
            
$profile->showname);
    } else {
       
// ..
    
}
}

function 
showname_callback($profile$value)
{
    return 
$profile->$value;
}

$profile = new stdClass;
$profile->nickname 'Fred';
$profile->city     'New York';
$profile->showname 'Hallo %nickname, du wohnst in %city!';

print 
showname($profile);
?>
Aber ich bekomms grade einfach nicht gebacken, weder mit preg_replace() noch mit preg_replace_callback().
Bei preg_replace_callback() habe ich ja scheinbar das Problem, dass die verwendete Funktion nur einen Parameter bekommen kann, den $matches-Array, dadurch also zwar der %xy Wert übergeben wird, $profile aber verloren geht.

PHP-Code:
<?php
preg_replace
("/(<\/?)(\w+)([^>]*>)/e",
             
"'\\1'.strtoupper('\\2').'\\3'",
             
$html_body);
?>
Vielleicht liegts ja auch an der Uhrzeit, aber das Beispiel aus
http://de.php.net/manual/en/function.preg-replace.php
konnte ich auch nicht für meine Bedürfnisse ummodeln

Prinzipiell könnte ich wohl auch die Attribute von $profile extrahieren und in nen str_replace()-Array geben, die Lösung mit preg_replace(_callback)() würde mich aber trotzdem interessieren..
Zergling-new ist offline  
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 08.07.2006, 03:29  
Erfahrener Benutzer
 
Registriert seit: 21.05.2008
Beiträge: 9.937
Zergling-new wird schon bald berühmt werden
Standard

Schwere Geburt, aber es läuft so:
PHP-Code:
<?php
function showname($profile)
{
    if (isset(
$profile->showname)) {
        
$vars   get_object_vars($profile);
        
$values array_values($vars);
        
$keys   array_keys($vars);
        
        
array_walk($keyscreate_function('&$v''$v = "%$v";'));

        return 
str_replace($keys$values$profile->showname);
    } else {
       
// ..
    
}
}

$profile = new stdClass;
$profile->nickname 'Fred';
$profile->city     'New York';
$profile->showname 'Hallo %nickname, du wohnst in %city!';

print 
showname($profile);
?>
Code:
Hallo Fred, du wohnst in New York!
Falls jemand die preg_replace..() Lösung gebastelt bekommt, nur her damit :P
Zergling-new ist offline  
Alt 08.07.2006, 03:43  
Waq
Erfahrener Benutzer
 
Registriert seit: 15.08.2004
Beiträge: 2.473
Waq
Standard Re: preg_replace(_callback)

Zitat:
Zitat von Zergling
Bei preg_replace_callback() habe ich ja scheinbar das Problem, dass die verwendete Funktion nur einen Parameter bekommen kann, den $matches-Array, dadurch also zwar der %xy Wert übergeben wird, $profile aber verloren geht.
Dafür gibts closures. Dann aber wieder gibts in PHP keine ordentlichen Closures, aber über create_function() oder eval() lässt sich dasselbe erreichen.
Darüber definiert man sich einfach die Callback-Funktion, mit beliebigen zusätzlichen Variablen direkt in die Funktion eingebaut statt als Parameter.
Waq ist offline  
Alt 08.07.2006, 06:22  
Gast
 
Beiträge: n/a
Standard Re: preg_replace(_callback)

Zitat:
Zitat von Zergling
Mein Ziel ist es gerade, die %platzhalter durch ihren Spaltenwert zu ersetzen (in PHP).
Dabei will ich nicht harcodet reinschreiben, welche Spaltentypen da sein könnten, sondern das in etwa so lösen:
Zwei Vorschläge:
1. einfach mit SQL erledigen:
Code:
CREATE TABLE `test1` (
  `id` int(11) NOT NULL default '0',
  `lastname` varchar(16) default NULL,
  `firstname` varchar(16) default NULL,
  `nickname` varchar(16) default NULL,
  `showname` varchar(32) default NULL
) TYPE=MyISAM;

INSERT INTO `test1` (`id`, `lastname`, `firstname`, `nickname`, `showname`) VALUES (1, 'Grabowski', NULL, 'Kalle', '%nickname %lastname');
INSERT INTO `test1` (`id`, `lastname`, `firstname`, `nickname`, `showname`) VALUES (2, NULL, NULL, 'Ratte', '%nickname');
INSERT INTO `test1` (`id`, `lastname`, `firstname`, `nickname`, `showname`) VALUES (3, 'Kampmann', 'Mark', NULL, '%firstname %lastname');

SELECT concat_ws(' ', firstname, nickname, lastname) as ergebnis FROM `test1` WHERE id=1;
Hier wird der String in showname nicht verwendet.

2. PHP: einige Templateklassen bieten den Luxus an, assiziative Arrays beim assign zu verwursten. Dann kannste Dir den Objektkram sparen.
 
Alt 08.07.2006, 11:46  
Erfahrener Benutzer
 
Registriert seit: 21.05.2008
Beiträge: 9.937
Zergling-new wird schon bald berühmt werden
Standard

Hallo ignatz,
grade ein einfaches CONCAT_WS will ich nicht benutzen, weil sich der Name eben immer mal anders zusammen setzen kann.
Wenn natürlich nur einer der drei Namen lastname/firstname/nickname in der DB steht ist die Sache klar (siehe Ratte), daher showname=NULL. Wenn jedoch mehrere Namen eingetragen sind, kann es ja auch sein, dass sich "Heinz Becker" "Becker, Heinz" nennen möchte (showname="%lastname, %firstname").
Die Spalte showname möchte ich also schon behalten.


Zitat:
Zitat von Waq
Darüber definiert man sich einfach die Callback-Funktion, mit beliebigen zusätzlichen Variablen direkt in die Funktion eingebaut statt als Parameter.
Ja, allerdings muss ich dann $profile ja auch explizit aufdröseln und in der Funktion definieren. Ich wollte es per Argument übergeben um darauf zu verzichten. Das habe ich aber bisher nicht hinbekommen.
Aber die Lösung mit str_replace() ist jetzt auch in Ordnung.
Zergling-new ist offline  
 


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
preg_replace() null, php preg_replace platzhalter beibehalten

Alle Zeitangaben in WEZ +2. Es ist jetzt 18:10 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum

Creative Commons License
Dieser Inhalt ist unter einer Creative Commons-Lizenz lizenziert.