Anzeige

preg_replace

preg_replace | PSD-Tutorials.de

Erstellt von netbandit, 20.10.2008.

  1. netbandit

    netbandit Aktives Mitglied

    12
    Dabei seit:
    18.05.2008
    Beiträge:
    1.145
    Geschlecht:
    männlich
    preg_replace
    Hallo,

    ich habe den nachfolgenden Code zusammengebastelt um in TAGS die nötigen Anführungszeichen zu ergänzen (sofern welche fehlen):


    PHP:
    1.  
    2. <?php
    3. $text= "<table cellspacing=0 cellpadding=0 width=\"100%\" border=0>";
    4. $text=preg_replace("/<([^>]+)=([^>\"\s]+)/", "<\\1=\"\\2\"\\3", $text);
    5. echo $text;
    6. ?>
    7.  
    Hat jemand ein Idee, wie ich es anstelle, daß alle fehlenden Anführungszeichen ersetzt werden? Im Moment wird nur das letzte korrigiert bzw. beim Modifer "U" das erste.

    Schonmal ein Dankeschön :)
     
    Zuletzt bearbeitet: 20.10.2008
    #1      
  2. blackout

    blackout Schaf im Wolfspelz

    Dabei seit:
    12.09.2005
    Beiträge:
    3.359
    Geschlecht:
    männlich
    Ort:
    Würzburg
    Kameratyp:
    Rollei 35 S
    preg_replace
    AW: preg_replace

    Puh, ich würde das nicht per Regex machen. Du willst mit dem Script schließlich schlechten Code korrigieren, und der hat viele Gesichter, die man nicht alle in *einen* Regex packen kann.
    Ein paar Beispiele:
    1. Verwendung von ' statt "
    2. foo='bar"baz'
    4. foo="bar"baz""
    5. <tablefoo=bar
    Im Endeffekt ist das was du machen willst, genau die Aufgabe des Quirksmode des Browsers, ich kann deine Motivation einerseits verstehen, schließlich arbeitet jeder Browser da anders. Andererseits: Seiten, die du durch deinen PHP-Parser schicken kannst, kannst du auch gleich ordentlich schreiben, dann sind solche Korrekturen nicht nötig. (OK, bisschen idealistisch, ich weiß wie es ist ein komplettes Forum umzuschreiben) ;)


    Edit: Habe seit der ersten Klasse nicht mehr bis Fünf gezählt, Entschuldigung bitte für die arme Drei. Als Entschädigung könnte ich dir nachweisen, dass die Fouriertransformation der 1 die Dirac-Delta-Funktion ist ;)
     
    Zuletzt bearbeitet: 20.10.2008
    #2      
  3. netbandit

    netbandit Aktives Mitglied

    12
    Dabei seit:
    18.05.2008
    Beiträge:
    1.145
    Geschlecht:
    männlich
    preg_replace
    AW: preg_replace

    So wie ich das bisher gesehen habe, fehlen nur die Anführungs - also wenn dann komplett ohne irgendwas.
    Der Sch****Code kommt von so einem "Javascript-Monster" und ich dachte mir, ich bereinige das lieber per PHP (Die Daten werden eh weiterverarbeitet). :uhm:
     
    #3      
  4. saila

    saila Moderatorle

    Dabei seit:
    21.06.2006
    Beiträge:
    2.239
    Geschlecht:
    männlich
    Ort:
    50°48'23.69" N 7°14'22.19" O
    Software:
    Eclipse, PHP5 OO, MySQL5, CSS(auch Barrierefrei), JS, Symfony
    preg_replace
    AW: preg_replace

    Hi,

    mal ein Ansatz:

    PHP:
    1.  
    2. $string    = "<table cellspacing=0 cellpadding='0' width=\"100%\" border=0>";
    3. $preg     = '#(<[a-zA-Z]+[=])+[\\\"\' ]+([\d]+)[\\\"\' ](>)#is';
    4. $repl     = '\\1 \\2 "\\3" \\4';
    5. $res     = preg_replace( $preg , $repl , $string );
    6. echo $res;
    7.  
     
    #4      
  5. netbandit

    netbandit Aktives Mitglied

    12
    Dabei seit:
    18.05.2008
    Beiträge:
    1.145
    Geschlecht:
    männlich
    preg_replace
    AW: preg_replace

    Danke saila, aber damit komme ich im Moment auch nicht viel weiter. :uhm:

    Werde es mal mit preg_match_all Tags ausprobieren und dann per Schleife mein Suchmuster verwenden.
     
    #5      
  6. saila

    saila Moderatorle

    Dabei seit:
    21.06.2006
    Beiträge:
    2.239
    Geschlecht:
    männlich
    Ort:
    50°48'23.69" N 7°14'22.19" O
    Software:
    Eclipse, PHP5 OO, MySQL5, CSS(auch Barrierefrei), JS, Symfony
    preg_replace
    AW: preg_replace

    Wieso nicht - was fehlt?
     
    #6      
  7. netbandit

    netbandit Aktives Mitglied

    12
    Dabei seit:
    18.05.2008
    Beiträge:
    1.145
    Geschlecht:
    männlich
    preg_replace
    AW: preg_replace

    Na, die Anführungszeichen :lol:

    Habe es im Moment so:

    PHP:
    1.  
    2. <?
    3. $text= "<table cellspacing=0 cellpadding=0 width=\"100%\" border='1'>
    4.         <tr><td>irgend ein text</td></tr>
    5.         </table><br>";
    6. $text.= "<table cellspacing='0' cellpadding=0 width=\"100%\" border=0>
    7.         <tr><td>irgend ein text</td></tr>
    8.         </table>";
    9. preg_match_all("/<([^>]+)>/", $text, $temp);
    10. $myarr=$temp[1];
    11. if(!empty($myarr)){
    12.     $ct=count($myarr);
    13.     for($i=0;$i<$ct;$i++){
    14.         $suchmuster[$i]="/<" . preg_quote($myarr[$i], '/') . ">/";
    15.         $ersatz[$i]='<' . preg_replace("/(.?)=([^>'\"\s]+)/", "\\1=\"\\2\"", $myarr[$i]) . '>';
    16.     }
    17.     if(count($suchmuster)>=1){
    18.        $text=preg_replace($suchmuster, $ersatz, $text);
    19.     }
    20. }
    21. echo $text;
    22. ?>
    23.  
    Arbeite aber noch weiter dran :uhm:
     
    #7      
  8. saila

    saila Moderatorle

    Dabei seit:
    21.06.2006
    Beiträge:
    2.239
    Geschlecht:
    männlich
    Ort:
    50°48'23.69" N 7°14'22.19" O
    Software:
    Eclipse, PHP5 OO, MySQL5, CSS(auch Barrierefrei), JS, Symfony
    preg_replace
    AW: preg_replace

    Stimmt :lol:

    Ist zwar nicht ausschl. bezogen auf HTML-tags, aber das funzt soweit. Kannst es ja entsprechend ergänzen für HTML-Tags.

    PHP:
    1.  
    2. $preg     = array( '#([a-zA-Z]+)\=[\\\"|\\\'|\']([\d]+)[\\\"|\\\'|\']#is' , '#([a-zA-Z]+)\=([\d]+)#is' );
    3. $repl     = array( '\\1="\\2"' , '\\1="\\2"' );
    4.  
     
    #8      
  9. netbandit

    netbandit Aktives Mitglied

    12
    Dabei seit:
    18.05.2008
    Beiträge:
    1.145
    Geschlecht:
    männlich
    preg_replace
    AW: preg_replace

    @saila: Da versteh ich ja jetzt gar nichts mehr. Vor allem was mich stutzig macht ist, daß Du beim Suchmuster a-zA-Z eingibst jedoch als Modifer auch ein i verwendest. Dachte eigentlich immer entweder/oder. Das \d , wofür steht das?

    Und beim Ersatz; müssten da nicht eigentlich nur ein Backslash vor den Zahlen stehen wenn Hochkommas verwendet werden?

    Tut mir echt leid, daß ich mich hier so dämlich anstelle. Ich versuche aber auch zu verstehen was ich hier eigentlich mache :uhm:

    Bei mir sieht es im Moment so aus:

    PHP:
    1.  
    2. <?
    3. $text= "<table cellspacing=0 cellpadding=0 width=\"100%\" border='1'>
    4.         <tr><td>irgend ein text</td></tr>
    5.         </table><br>";
    6. $text.= "<table cellspacing='0' cellpadding=0 width=\"100%\" border=1>
    7.         <tr><td>irgend ein <a href=http://www.test.de>text</a></td></tr>
    8.         </table>";
    9. $text=stripslashes($text);
    10. preg_match_all("/<([^\/][^>]+)>/", $text, $temp); // Wenn ich hier noch ein Gleichheitszeichen berücksichtigen könnte, würde sich die Anzahl der Übereinstimmungen reduzieren
    11. $myarr=$temp[1];
    12. if(!empty($myarr)){
    13.     $ct=count($myarr);
    14.     for($i=0;$i<$ct;$i++){
    15.         $suchmuster[$i]='/<' . preg_quote($myarr[$i], '/') . '>/';
    16.         $ersatz[$i]='<' . preg_replace("/([a-z])=([^'\"\s]+)/i", "\\1=\"\\2\"", $myarr[$i]) . '>';
    17.     }
    18.     if(count($suchmuster)>=1){
    19.        $text=preg_replace($suchmuster, $ersatz, $text);
    20.     }
    21. }
    22. echo $text;
    23. ?>
    24.  
    Grundsätzlich passiert ja schonmal das, was ich haben möchte. Zeile 10 (Kommentar) macht mich im Moment noch fertig :D

    Edit: Ich glaube ich hab es geschafft

    PHP:
    1.  
    2. <?
    3. $text= "<table cellspacing=0 cellpadding=0 width=\"100%\" border='1'>
    4.         <tr><td>irgend ein text</td></tr>
    5.         </table><br>";
    6. $text.= "<table cellspacing='0' cellpadding=0 width=\"100%\" border=1>
    7.         <tr><td>irgend ein <a href=http://www.test.de>text</a></td></tr>
    8.         </table>";
    9. $text=stripslashes($text);
    10. preg_match_all("/<(([^\/][^>]+)\=([^>]+))>/", $text, $temp);
    11. $myarr=$temp[1];
    12. if(!empty($myarr)){
    13.     $ct=count($myarr);
    14.     #echo $ct;
    15.    for($i=0;$i<$ct;$i++){
    16.         $suchmuster[$i]='/<' . preg_quote($myarr[$i], '/') . '>/';
    17.         $ersatz[$i]='<' . preg_replace("/([a-z])\=([^'\"\s]+)/i", "\\1=\"\\2\"", $myarr[$i]) . '>';
    18.     }
    19.     if(count($suchmuster)>=1){
    20.        $text=preg_replace($suchmuster, $ersatz, $text);
    21.     }
    22. }
    23. echo $text;
    24. ?>
    25.  
    Wenn jemand noch Fehler findet, bitte melden :)
     
    Zuletzt bearbeitet: 21.10.2008
    #9      
  10. saila

    saila Moderatorle

    Dabei seit:
    21.06.2006
    Beiträge:
    2.239
    Geschlecht:
    männlich
    Ort:
    50°48'23.69" N 7°14'22.19" O
    Software:
    Eclipse, PHP5 OO, MySQL5, CSS(auch Barrierefrei), JS, Symfony
    preg_replace
    AW: preg_replace

    Hast du es getestet?

    Erläuterung zum Suchmuster:

    '#([a-zA-Z]+)\=[\\\"|\\\'|\']([\d]+)[\\\"|\\\'|\']#is' , '#([a-zA-Z]+)\=([\d]+)#is'

    [a-zA-Z] für cellspacing oder cellpadding oder align usw.. und das + führ mehrere Buchstaben in Folge.
    ([\d]+) für [0-9] und + für mehrere Zahlen (4) oder (100) in Folge.
    [\\\"|\\\'|\'] für Zeichen \" oder \' oder '

    Modifier i steht für groß oder klein (es gibt ja so Spezialisten, welche HTML-Tags groß schreiben).
    Modifier s unterteilt in einzelne Zeilen bei der Suche.

    Im zweiten Suchmuster wird nach z.B. cellspacing=10 gesucht.

    Im Grunde müsstest du nur noch ein evtl. % Zeichen in dem Suchmuster unterbringen, da die Suche nicht mit folgendem Erfolg hat:

    widht='10%' oder width=10%

    Wie schon erwähnt muss ggf. das Suchmuster insoweit ergänzt werden, das es ausschl. auf HTML-Tags zutreffend ist, was bislang nicht eintritt. Sprich der gesamte String wird durchsucht.
     
    #10      
  11. CIX88

    CIX88 Aktives Mitglied

    Dabei seit:
    06.04.2006
    Beiträge:
    814
    Geschlecht:
    männlich
    Ort:
    GR
    preg_replace
    AW: preg_replace

    Wieso benutzt ihr [a-zA-Z] bei Modifer i ?
    :)
     
    #11      
  12. saila

    saila Moderatorle

    Dabei seit:
    21.06.2006
    Beiträge:
    2.239
    Geschlecht:
    männlich
    Ort:
    50°48'23.69" N 7°14'22.19" O
    Software:
    Eclipse, PHP5 OO, MySQL5, CSS(auch Barrierefrei), JS, Symfony
    preg_replace
    AW: preg_replace

    Ok - jetzt hab ich es auch... :D - natürlich brauch man den Modi i nicht :rolleyes:
     
    #12      
x
×
×
teststefan