Portal > Foren > PHP > PHP-Programmierung > preg_match -replace [url]
Antwort
 
Themen-Optionen
Alt 23.11.2006, 21:30 Nach oben    #1
Verplanter Benutzer
 
Registriert seit: 14.12.2004
Beiträge: 227
Standard preg_match -replace [url]

Hallo,

habe hier einen Codefetzen der mich auf die Palme bringt, es geht darum
einen String zu ersetzen ... aber in diesem ist eine url angegeben

z.B. home.php?1=2

PHP-Code:
$string str_replace('?','\?',$string);

        while (
preg_match("/<a#(.*)#a>/isU"$string$pregMatch)) {

            
$arrayString explode('#',$pregMatch[1]);

            
$content '<img src="./html/system/img/link.gif" alt="link.gif"> <a href="'str_replace('\?','?',$arrayString[0]) .'" title="'.$arrayString[1].'" name="'.$arrayString[1].'" accesskey="'.$arrayString[2].'">'.$arrayString[1].'</a><br>';

            
$string preg_replace("/<a#".$pregMatch[1]."#a>/isU",$content,$string);

        } 
Wenn man ?1=2 weglässt geht es ... ich verstehe nur nicht warum da
ich ja ? ausklammere!?

Wo liegt der Wurm begraben sieht ihn jemand ...
__________________
Das Leben ist zwar bloß ein Adventure-Game, aber die Grafik ist verdammt gut.
Ich such immer noch den Cheat für unlimited money!
DasMööp ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 24.11.2006, 06:51 Nach oben    #2
Lutz
 
Benutzerbild von MrNiceGuy
 
Registriert seit: 14.08.2005
Ort: Nienburg / Weser
Beiträge: 684
Standard

Das Problem sollte in dieser Zeile liegen:

PHP-Code:
            $string preg_replace("/<a#".$pregMatch[1]."#a>/isU",$content,$string); 
Du hast zwar am Anfang das ? Mit einem Backslash versehen, jedoch bin ich mir nicht sicher, dass das auch Bestand hat. Überprüfe mal das Suchergebnis $pregMatch[1]. Ansonsten rate ich dir aber auch noch folgende Funktion an: preg_quote()
__________________
Paradox ist, wenn jemand für seinen Alkoholkonsum geradestehen soll
MrNiceGuy ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 24.11.2006, 10:32 Nach oben    #3
Verplanter Benutzer
 
Registriert seit: 14.12.2004
Beiträge: 227
Standard

Hi,

PHP-Code:
$string str_replace('?','\?',$string); 

        while (
preg_match("/<a#(.*)#a>/isU"$string$pregMatch)) { 

            
$arrayString explode('#',$pregMatch[1]); 

            
$content '<img src="./html/system/img/link.gif" alt="link.gif"> <a href="'str_replace('\?','?',$arrayString[0]) .'" title="'.$arrayString[1].'" name="'.$arrayString[1].'" accesskey="'.$arrayString[2].'">'.$arrayString[1].'</a><br>'

echo 
$pregMatch[1].'<br>';

            
$string preg_replace("/<a#".$pregMatch[1]."#a>/isU",$content,$string); 

        } 
gibt folgendes aus

homepage.php5#Homepage#h
index.php5#Test#t
homepage.php5\?do=newPage#Neue Page#1
homepage.php5\?do=newPage#Neue Page#1
homepage.php5\?do=newPage#Neue Page#1
homepage.php5\?do=newPage#Neue Page#1
homepage.php5\?do=newPage#Neue Page#1
homepage.php5\?do=newPage#Neue Page#1
... (wiederholung unendlich da er ja nicht ersetzt...)

Ich schau mit mal preg_quote() an ...

Edit: das (=) könnte noch das Problem Darstellen ...

Zitat:
Spezielle Zeichen regulärer Ausdrücke sind: . \ + * ? [ ^ ] $ ( ) { } = ! < > | :
__________________
Das Leben ist zwar bloß ein Adventure-Game, aber die Grafik ist verdammt gut.
Ich such immer noch den Cheat für unlimited money!
DasMööp ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 24.11.2006, 10:39 Nach oben    #4
Verplanter Benutzer
 
Registriert seit: 14.12.2004
Beiträge: 227
Standard

Serh schön ... die Function ist mal sehr sehr Hilfreich


Also wie folgt Funktioniert es:

PHP-Code:
        while (preg_match("/<a#(.*)#a>/isU"$string$pregMatch)) {

            
$arrayString explode('#',$pregMatch[1]);

            
$content '<img src="./html/system/img/link.gif" alt="link.gif"> <a href="'str_replace('\?','?',$arrayString[0]) .'" title="'.$arrayString[1].'" name="'.$arrayString[1].'" accesskey="'.$arrayString[2].'">'.$arrayString[1].'</a><br>';

            
$string preg_replace("/<a#".preg_quote($pregMatch[1])."#a>/isU",$content,$string);

        }

        return 
$string
Ich danke für den Tip !
__________________
Das Leben ist zwar bloß ein Adventure-Game, aber die Grafik ist verdammt gut.
Ich such immer noch den Cheat für unlimited money!
DasMööp ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 25.11.2006, 09:37 Nach oben    #5
Lutz
 
Benutzerbild von MrNiceGuy
 
Registriert seit: 14.08.2005
Ort: Nienburg / Weser
Beiträge: 684
Standard

Keine Ursache, nur wo ich mir das jetzt alles so anschaue, fällt mir auf, dass folgender Code sehr wahrscheinlich deutlich schneller ist:

PHP-Code:
$string str_replace ($pregMatch[0], $content$string); 
Das pregMatch[0] steht dabei für den kompletten gefundenen String, wodurch bei einer Änderung der Codes (z.B. wenn du anstatt <a#....#a> <link#...#link> nutzen willst) nurnoch der RegEx geändert werden muss. Jedenfalls sollte die Funktion str_replace gegenüber der preg_replace schon deutlich schneller sein und zusätzlich fällt auch noch das preg_quote() weg.
Du kannst übrigens mal versuchen, ob es auch ohne die Ersetzung von ? in \? funktioniert, würde dir zusätzlich 2 Funktionsaufrufe sparen und ich gehe mal davon aus, dass du das probiert hast, um den preg_replace() zum Laufen zu bekommen!? *kratzamkopf*
__________________
Paradox ist, wenn jemand für seinen Alkoholkonsum geradestehen soll
MrNiceGuy ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 26.11.2006, 11:10 Nach oben    #6
Verplanter Benutzer
 
Registriert seit: 14.12.2004
Beiträge: 227
Standard

Mit str_replace hast Du vollkommen recht habe das mal eben zum Bastelln so hingeklatscht...

PHP-Code:
class test {

    private 
$content null;
    private 
$string null;
    private 
$array null;

    public function 
__construct() {
        
$this->test_preg_Match();
    }
    
    public function 
test_preg_Match() {

        
$this->string "[§cms_boxen.php5?do=newBox#Neue Box#1]";
        
$this->string .= "[§cms_boxen.php5?do=newBox#Neue Box#1]";

        while (
preg_match("/\[§(.*)\]/isU"$this->string$pregMatch)) {

            
$this->array explode('#',$pregMatch[1]);
            
            
$this->content '<a href="'.$this->array[0].'" title="'.$this->array[1].'" name="'.$this->array[1].'" accesskey="'.$this->array[2].'">'.$this->array[1].'</a><br>';

            
$this->string str_replace($pregMatch[0],$this->content,$this->string);

        }

        echo 
$this->string;

    }
    
}

$test = new test(); 
Ich denke so ist das minimum erreicht ... ausser man würde in dem preg
gleich die inhalte zwischen den # abfragen. Sehe das aber als Problem wenn
es mehr oder weniger Inhalte im String sind.

[§cms_boxen.php5?do=newBox#Neue Box#1]
[§cms_boxen.php5?do=newBox#Neue Box]

Meine so ist es schon gut oder fällt Dir noch was ein !?
__________________
Das Leben ist zwar bloß ein Adventure-Game, aber die Grafik ist verdammt gut.
Ich such immer noch den Cheat für unlimited money!
DasMööp ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 26.11.2006, 15:35 Nach oben    #7
Lutz
 
Benutzerbild von MrNiceGuy
 
Registriert seit: 14.08.2005
Ort: Nienburg / Weser
Beiträge: 684
Standard

Uff, sicher fallen mir da einige Möglichkeiten ein, aber du musst doch wissen, wie du es für am sinnvollsten hälst, schließlich musst du mit dem Funktionsumfang zufrieden sein und wenn es alles passt, dann lass es doch einfach so, ich sehe in der Verarbeitungsweise jedenfalls keine nennenswerten Nachteile

Einziger Punkt, über den du nachdenken solltest ist, dass wenn du mal Links mit Ankern benötigst, dass du ein anderes Trennzeichen nehmen solltest, denn dann brauchst du selbst in der URL die Raute. Prozent sind aber auch wieder nicht sinnig, da diese zum maskieren von Sonderzeichen usw. genutzt werden, vielleicht solltest du lieber auf die PIPE (|) umsteigen als Trennzeichen!? Ist aber auch nur dann notwendig wie gesagt, wenn du mal Anker benötigst...

Jetzt ist mir doch noch ein Punkt eingefallen
__________________
Paradox ist, wenn jemand für seinen Alkoholkonsum geradestehen soll
MrNiceGuy ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 27.11.2006, 18:02 Nach oben    #8
Verplanter Benutzer
 
Registriert seit: 14.12.2004
Beiträge: 227
Standard

Wenn man das genau nimmt absolut richtig habe mich für Pipe entschieden.
__________________
Das Leben ist zwar bloß ein Adventure-Game, aber die Grafik ist verdammt gut.
Ich such immer noch den Cheat für unlimited money!
DasMööp ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Antwort

Lesezeichen


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

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 aus

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
[url] BBCode Garnele PHP-Programmierung 11 03.12.2007 18:52
[MySQL] REPLACE() bei UPDATE verwenden Ben Datenbanken 4 31.12.2005 16:33


Alle Zeitangaben in WEZ +2. Es ist jetzt 11:03 Uhr.


Powered by vBulletin® Version 3.7.3 (Deutsch)
Copyright ©2000 - 2008, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44