php-resource



Zurück   PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr > Entwicklung > PHP Developer Forum
 

Login

 
eingeloggt bleiben
star Jetzt registrieren   star Passwort vergessen
 

 

 


PHP Developer Forum Hier habt ihr die Möglichkeit, eure Skriptprobleme mit anderen Anwendern zu diskutieren. Seid so fair und beantwortet auch Fragen von anderen Anwendern. Dieses Forum ist sowohl für ANFÄNGER als auch für PHP-Profis! Fragen zu Laravel, YII oder anderen PHP-Frameworks.

Antwort
 
LinkBack Themen-Optionen Thema bewerten
  #1 (permalink)  
Alt 09-03-2009, 13:21
Olli4
 Registrierter Benutzer
Links : Onlinestatus : Olli4 ist offline
Registriert seit: Mar 2008
Beiträge: 112
Olli4 ist zur Zeit noch ein unbeschriebenes Blatt
Standard preg_replace & Funktion

Hi

Ich habe mal wieder ein kleines Problem, und hoffe ihr könnt mir weiterhelfen.

Da ich teilwörter bestimmt formatieren möchte und in die Datenbank schreiben möchte, verwende ich preg_replace mit einer funktion beim ersetzen. Das ganze sieht dann so aus:
PHP-Code:
$ersetzung $this->mfct('\\1''\\2''\\3'); 
$this->text preg_replace($suchmuster$ersetzung$this->text); 
Nun habe ich folgende zwei probleme, und hoffe ihr könnt mir da weiterhelfen:
1. Er nimmt mit die Werte aus dem Suchmuster nicht mit. Wenn ich beim ersetzen einfach '\\1' mache, ersetzt er mir logischerweise den text mit dem ausgabewert. In der Funktion übergibt er jedoch \\1 statt dem Inhalt. Wie kann ich das ändern?

2. Kann ich dies irgendwie der reihe nach ablaufen lassen? Ich möchte wie gesagt die Werte in die Datenbank schreiben, und dort dann die ID ausgeben. Also so würde dies dann ungefähr aussehen:
PHP-Code:
function mfct($text1$text2$text3) {
    
//Hier kommt das Insert für die Datenbank.
    
return '[meineID]'.mysql_insert_id().'[/meineID]';        

Abgesehen davon, dass ich bei text 1 - 3 nicht den richtigen wert habe, funktioneirt es fast. Mein Problem ist, dass er nur einen Datenbankeintrag erstellt und somit auch immer nur diese eine ID ausgibt. Also wenn er im Text 5 einträge ersetzen muss fügt er nur einen in die Datenbank.

Wie könnt ich mein Problem lösen?

Habe mir auch überlegt mit preg_match_all zu arbeiten. Dies würde soweit auch gehen, bis auf dass das ich das Problem habe das ich nicht weiss wie ich dann '[meineID]'.mysql_insert_id().'[/meineID]' mit dem Teil im ganzen Text ersetzen lassen könnte. Mit str_replace würde es gehen. Jedoch ist hier das problem wenn es selbe Einträge gibt. also wenn wir im Text 5 mal "Hund" haben, kann ich ja nicht einfach ein str_replace machen da ich sonst bei jedem "Hund" nur "[meineID]1[/meineID]" hätte statt bei jedem hund die ID die er generiert hat in der Funktion für dieses Wort.

Danke schonmal für eure Hilfe.

Gruss

Olli
Mit Zitat antworten
  #2 (permalink)  
Alt 09-03-2009, 17:12
Benutzerbild von fireweasel fireweasel
 Registrierter Benutzer
Links : Onlinestatus : fireweasel ist offline
Registriert seit: Sep 2008
Ort: At home
Beiträge: 851
fireweasel wird schon bald berühmt werdenfireweasel wird schon bald berühmt werden
fireweasel eine Nachricht über AIM schicken fireweasel eine Nachricht über Yahoo! schicken
Standard Re: preg_replace & Funktion

Können wir die beiden Aufgaben nacheinander abarbeiten?
Also erst das Ersetzen und dann das Eintragen in die Datenbank?

Zitat:
Original geschrieben von Olli4
Da ich teilwörter bestimmt formatieren möchte und in die Datenbank schreiben möchte, verwende ich preg_replace mit einer funktion beim ersetzen. Das ganze sieht dann so aus:
PHP-Code:
$ersetzung $this->mfct('\\1''\\2''\\3'); 
$this->text preg_replace($suchmuster$ersetzung$this->text); 
Da stellt sich natürlich sofort die Frage: Was gibt $this->mfct() zurück?

Weiter unten erfahren wir, dass es ein String ist, der aus einer ID besteht, die zwischen zwei gleichbleibende Strings geklebt wird. Das solltest du vor dem Aufruf von preg_replace() probeweise mal überprüfen:
Zitat:
PHP-Code:
function mfct($text1$text2$text3) {
    
//Hier kommt das Insert für die Datenbank.
    
return '[meineID]'.mysql_insert_id().'[/meineID]';        

var_dump($ersetzung); 
Zitat:
Nun habe ich folgende zwei probleme, und hoffe ihr könnt mir da weiterhelfen:
1. Er nimmt mit die Werte aus dem Suchmuster nicht mit. Wenn ich beim ersetzen einfach '\\1' mache, ersetzt er mir logischerweise den text mit dem ausgabewert. In der Funktion übergibt er jedoch \\1 statt dem Inhalt.
Suchmuster? $suchmuster? Was steht denn in $suchmuster?

Die Funktion mysql_insert_id() gibt entweder eine Ganzzahl oder FALSE zurück. Also gibt deine Funktion sowas wie '[meineID]47110815[/meineID]' oder '[meineID][/meineID]' zurück. Dies ist der Ersetzungsstring, mit dem preg_replace() ein gefundenes Suchmuster überschreibt. Irgendwelche Backslashes mit Zahlen kommen hierbei aber nicht vor.
Mit Zitat antworten
  #3 (permalink)  
Alt 09-03-2009, 18:42
kuddeldaddeldu
 Registrierter Benutzer
Links : Onlinestatus : kuddeldaddeldu ist offline
Registriert seit: Sep 2006
Beiträge: 437
kuddeldaddeldu ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Hi,

PHP-Code:
$ersetzung "$this->mfct('\\\\1', '\\\\2', '\\\\3')"
falls Modifier e gesetzt ist, sonst preg_replace_callback() verwenden.

LG
Mit Zitat antworten
  #4 (permalink)  
Alt 09-03-2009, 19:42
Olli4
 Registrierter Benutzer
Links : Onlinestatus : Olli4 ist offline
Registriert seit: Mar 2008
Beiträge: 112
Olli4 ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Guten Abend

Werde es morgen gleich ausprobieren danke.

Denke das mit preg_replace_callback oder modifire e wird klappen aber sehe es dann morgen. Werde mich melden wenn das nicht geht. Was bedeutet denn e genau? In den meisten tutorials wird e nicht erwähnt.

@fireweasel: Zu deinen Fragen. Nein ausser du findest eine Lösung wie es geht. Sagen wir ich habe ein Text wo 5 mal das Wort "Hund" vorkommt. Nun möchte ich das er eben dieses Wort alle 5 mal ersetzt und dabei in die Funktion geht. Denn in der Funktion soll pro wort was er ersetzt ein Datenbankeintrag erstellt werden, und das Wort dann so ersetzen "[meineID]ID AUS DEM INSERT[/meineID]". In der Funktion wird der Text nämlich nach einem bestimmten Prinzip formatiert und da die reihenfolge bleiben sollte, muss jedes wort das ersetzt wird direkt die richtige Datenbank eintrag ID bekommen. Hoffe ich konnte es soweit erklären.

So wie es bisher ist, ersetzt er Hund mit [meineID]1[/meineID] das problem ist, trotz das es 5 mal vorkommt macht er mir nur einen Datenbank eintrag und gibt immer nur die ID1 vom ersten aus. Und genau dies soll geändert werden

Gruss

olli
Mit Zitat antworten
  #5 (permalink)  
Alt 09-03-2009, 20:08
kuddeldaddeldu
 Registrierter Benutzer
Links : Onlinestatus : kuddeldaddeldu ist offline
Registriert seit: Sep 2006
Beiträge: 437
kuddeldaddeldu ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
Original geschrieben von Olli4
Was bedeutet denn e genau? In den meisten tutorials wird e nicht erwähnt.
http://regexp-evaluator.de/tutorial/modifier/#eval
Mit Zitat antworten
  #6 (permalink)  
Alt 10-03-2009, 07:20
Olli4
 Registrierter Benutzer
Links : Onlinestatus : Olli4 ist offline
Registriert seit: Mar 2008
Beiträge: 112
Olli4 ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Hi

Danke an beide. Mit dem Modifire e hat nun alles geklappt. Auch der zweite DB Eintrag wurde erstellt. Alles wie es soll danke. Das Problem hats wohl gegeben, weil die Ersetzung schon nicht klappte.

gruss

Olli
Mit Zitat antworten
  #7 (permalink)  
Alt 10-03-2009, 12:32
Benutzerbild von fireweasel fireweasel
 Registrierter Benutzer
Links : Onlinestatus : fireweasel ist offline
Registriert seit: Sep 2008
Ort: At home
Beiträge: 851
fireweasel wird schon bald berühmt werdenfireweasel wird schon bald berühmt werden
fireweasel eine Nachricht über AIM schicken fireweasel eine Nachricht über Yahoo! schicken
Standard

preg_replace_callback() wäre auch meine Funktion der Wahl ...

Zitat:
... Sagen wir ich habe ein Text wo 5 mal das Wort "Hund" vorkommt. Nun möchte ich das er eben dieses Wort alle 5 mal ersetzt und dabei in die Funktion geht. Denn in der Funktion soll pro wort was er ersetzt ein Datenbankeintrag erstellt werden, und das Wort dann so ersetzen "[meineID]ID AUS DEM INSERT[/meineID]". In der Funktion wird der Text nämlich nach einem bestimmten Prinzip formatiert und da die reihenfolge bleiben sollte, muss jedes wort das ersetzt wird direkt die richtige Datenbank eintrag ID bekommen. Hoffe ich konnte es soweit erklären.
PHP-Code:
class bewareOfTheDog {
  
// ...

  /// Datenbank-Kram

  /// simulierte Datenbankabfrage
  // zum Testen von preg_replace_callback()
  
function last_insert_rowid(
    
$data_to_insert ''
  
) {
    static 
$insert_id 0;
    ++
$insert_id;
    return 
$insert_id;
  }
  
  
/// Beispielfunktion fuer echte Datenbankabfrage
  
function last_insert_rowid_(
    
$data_to_insert ''
  
) {
    
$result mysql_query(
        
$this->_db// a mysql-db resource
        
sprintf('INSERT INTO your_table (your_column) VALUES (\'%s\')',
            
mysql_real_escape_string($data_to_insert)
        )
    );
    if (!
is_resource($result)) {
      
// in dem Fall wuerde mysql_insert_id() die ROWID des letzten
      // erfolgreichen INSERTs zurückgeben, und das wollen wir ja nicht
      // also Fehlerbehandlung
      // und Fehler-Wert zurückgeben
      
return FALSE;
    }
    return 
mysql_insert_id($result);
  }

  
/// Suchen-und-Ersetzen-Kram

  /// callback-funktion
  
function make_id(
    
$hits /// von preg_replace_callback geliefertes Treffer-Array
  
) {
    
// aus dem Trefferarray den passenden Eintrag herausziehen
    
$data_to_insert $hits[0];

    
// falls die Datenbankabfrage fehlschlaegt
    
$insert_id $this->last_insert_rowid($data_to_insert);
    if (!
is_int($insert_id)) {
      
// Fehlerbehandlung
      // ...
    
}
    return 
"[meineID]${insert_id}[/meineID]";
  }
  
  
///
  
function suchen_und_ersetzen(
    
$nadel '',
    
$heuhaufen ''
  
) {
    
$nadel '/' preg_quote($nadel'/') . '/';
    return 
preg_replace_callback($nadel, array($this'make_id'), $heuhaufen);
  }

}

/// Anwendung

// der zu durchsuchende Text
$hundehaufen 'Hund-Katze-Maus. Spitzpudeldackel.
Kein Gnadenbrot für einen armen Hund.
A Hund isser scho!
Krummer Hund. Falscher Hund. Dicker Hund.
Kalter Hund. Dummer Hund. Schlauer Hund.
'
;

// der zu findende Text
$hund 'Hund';

$botd = new bewareOfTheDog();

// ...

$ersetzt $botd->suchen_und_ersetzen($hund$hundehaufen);

// Ersetzungsergebnis zum Test ausgeben
echo $ersetzt
Verschluckte Backslashes hat wie immer die Board-Software zu verantworten. Bei mir hat alles funktioniert.

Zitat:
So wie es bisher ist, ersetzt er Hund mit [meineID]1[/meineID] das problem ist, trotz das es 5 mal vorkommt macht er mir nur einen Datenbank eintrag und gibt immer nur die ID1 vom ersten aus. Und genau dies soll geändert werden
Siehe die Kommentare in meiner Beispielfunktion fuer echte Datenbankabfrage". Das Auswerten der Rückgabewerte von mysql_insertid() dürfte meistens erhellend sein. Außerdem ist es auch hilfreich, eventuelle Fehlermeldungen der Datenbank anzuzeigen.

Geändert von fireweasel (10-03-2009 um 12:35 Uhr)
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 

Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre 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


PHP News

ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlicht
ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlichtDie bekannte Marktplatzsoftware ebiz-trader ist in der Version 7.5.0 veröffentlicht worden.

28.05.2018 | Berni

Wissensbestand in Unternehmen
Wissensbestand in UnternehmenLebenslanges Lernen und Weiterbilden sichert Wissensbestand in Unternehmen

25.05.2018 | Berni


 

Aktuelle PHP Scripte

PHP Server Monitor

PHP Server Monitor ist ein Skript, das prüft, ob Ihre Websites und Server betriebsbereit sind.

11.09.2018 Berni | Kategorie: PHP/ Security
PHP WEB STATISTIK ansehen PHP WEB STATISTIK

Die PHP Web Statistik bietet Ihnen ein einfach zu konfigurierendes Script zur Aufzeichnung und grafischen und textuellen Auswertung der Besuchern Ihrer Webseite. Folgende zeitlichen Module sind verfügbar: Jahr, Monat, Tag, Wochentag, Stunde Folgende son

28.08.2018 phpwebstat | Kategorie: PHP/ Counter
Affilinator - Affilinet XML Produktlisten Skript

Die Affilinator Affilinet XML Edition ist ein vollautomatisches Skript zum einlesen und darstellen der Affili.net (Partnerprogramm Netzwerk) Produktlisten und Produktdaten. Im Grunde gibt der Webmaster seine Affilinet PartnerID ein und hat dann unmittelb

27.08.2018 freefrank@ | Kategorie: PHP/ Partnerprogramme
 Alle PHP Scripte anzeigen

Alle Zeitangaben in WEZ +2. Es ist jetzt 05:00 Uhr.