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 04-06-2011, 00:01
[pezi]
 Registrierter Benutzer
Links : Onlinestatus : [pezi] ist offline
Registriert seit: Aug 2002
Beiträge: 7
[pezi] ist zur Zeit noch ein unbeschriebenes Blatt
Standard REGEX - ist Modifier U hier wirklich richtig?

Hallo
folgender Code soll die Maße eines *.jpg auf 100x100 skalieren(*)
Vor u. nach dem IMG steht Text der auch Anführungszeichen, Sonderz. usw. enthalten kann.
PHP-Code:
$eingabe 'Text "<em>blabla</em>" vorm Bild <br /><img src="bild.jpg" width="320" height="240" /><br />und mehr "<em>blabla</em>".';
$pattern '#width="(.*)" height="(.*)"#U'// (s unten **)
$replace 'width="100" height="100"';        // (s unten ***)
$ausgabe preg_replace($pattern,$replace,$eingabe);
echo 
$ausgabe
Der Code funzte soweit, nur sobald nach dem Bild Text in Anführungszeichen war ging nix mehr, der IMG TAG u. Texte wurden durcheinander geworfen u. vermischt, usw.

Habe es mit dem ungierig Modifier U versucht - und siehe da: es klappt!
Doch ich hab das Gefühl das ging zu einfach, da habi doch sicher was anderes falsch gemacht, oder?

Denn zb. sobald ich $eingabe in Zeilen trenne, also zb. der Teil nach dem Bild extra steht klappts auch so, ohne U :
PHP-Code:
$eingabe 'Text "<em>blabla</em>" vorm Bild <br /><img src="bild.jpg" width="320" height="240" /><br />
und mehr "<em>blabla</em>".'


Optimal?
Doch ich denke mal es wäre sicherer wenn man den ganzen IMG TAG im Suchmuster definieren würde damit die Funktion weiß wo wirklich das Ende des Bildes ist und wo der weitere, unantastbare (Quell)Text beginnt.
Wie könnte sowas dann aussehen, wo, wie gehöre das notiert, ich kenne das nur soweit das
Code:
<img[^>]+>
den gesamten IMG TAG beschreibt...



*) Das width u. height hier nur skaliert wird ist Absicht, ich weiß das so nicht wirklich ein kleineres Bild entsteht
**) ...width="(.*)" height="(.*)"# ist deswegen in Unterausdrücken geklammert weil die eigentlich mittels preg_replace_callback
weiterverarbeitet werden.
***) die Reihenfolge v. width u. height ist immer gleich
Mit Zitat antworten
  #2 (permalink)  
Alt 04-06-2011, 01:34
Benutzerbild von mermshaus mermshaus
 Registrierter Benutzer
Links : Onlinestatus : mermshaus ist offline
Registriert seit: Jun 2009
Beiträge: 451
mermshaus wird schon bald berühmt werden
Standard

Kurz und knapp:

Der U-Modifier ist eine Lösung in dem Sinne, in dem du sie beabsichtigt hast.

Zitat:
Denn zb. sobald ich $eingabe in Zeilen trenne, also zb. der Teil nach dem Bild extra steht klappts auch so, ohne U
Sieh dir den s-Modifier an. "." matcht standardmäßig keine Zeilenumbrüche.

- PHP: Possible modifiers in regex patterns - Manual

Zitat:
Doch ich denke mal es wäre sicherer wenn man den ganzen IMG TAG im Suchmuster definieren würde damit die Funktion weiß wo wirklich das Ende des Bildes ist und wo der weitere, unantastbare (Quell)Text beginnt.
Ja, aber Regex sind da „funktional begrenzt“. Was ist etwa, wenn die Attribute width und height vertauscht sind[1]? Eine gute Lösung wäre ein echter Parser wie DOMDocument.

- PHP: DOMDocument - Manual

Aber dennoch: Ein (hoffentlich) etwas „passenderer“ regulärer Ausdruck[2]:

PHP-Code:
<?php

$subject 
'<img
    src="bla.jpg"
    width="100"
    height="200"/>'
;

$pattern '/<img[^>]*width="([^"]*)"[^>]*height="([^"]*)"[^>]*\/?>/s';

$matches = array();

preg_match($pattern$subject$matches);

header('Content-Type: text/plain; charset=UTF-8');

print_r($matches);

/*
Array
(
    [0] => <img
    src="bla.jpg"
    width="100"
    height="200"/>
    [1] => 100
    [2] => 200
)
*/
Doku zu PCRE: PHP: PCRE Patterns - Manual


1: Auch das ist wahrscheinlich noch mit einem regulären Ausdruck hinzubiegen (wenn der Attributname auch zurückgeliefert wird), aber irgendwann wird es dann albern.

2: Manche Stern-Quantifiers sollten vielleicht Plus sein.

Geändert von mermshaus (04-06-2011 um 01:47 Uhr)
Mit Zitat antworten
  #3 (permalink)  
Alt 04-06-2011, 02:44
[pezi]
 Registrierter Benutzer
Links : Onlinestatus : [pezi] ist offline
Registriert seit: Aug 2002
Beiträge: 7
[pezi] ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Hallo u. danke für die Antwort

Zitat:
Der U-Modifier ist eine Lösung in dem Sinne, in dem du sie beabsichtigt hast.
dh. so falsch war das mal nicht

Zitat:
Sieh dir den s-Modifier an. "." matcht standardmäßig keine Zeilenumbrüche.
ja, den kenn ich - nur irgendwie ging das auch nicht. Doch ich test auch weiter mit dem "s"

kenn ich, danke - doch für einen REGEX Newbie ist ev. der RegExp-Evaluator leichtere Kost?

Zitat:
Ja, aber Regex sind da „funktional begrenzt“. Was ist etwa, wenn die Attribute width und height vertauscht sind[1]? Eine gute Lösung wäre ein echter Parser wie DOMDocument.
- PHP: DOMDocument - Manual
Tja, klingt ok - nur wie gesagt die zwei Attribute stehen immer so, (Quelle ist der TinyMCE Editor und auf den kann ich mich verlassen das er nicht plötzlich was vertauscht)

Den
PHP-Code:
'/<img[^>]*width="([^"]*)"[^>]*height="([^"]*)"[^>]*\/?>/s' 
habi mal statt meinen RegAusdruck reingetan, aber irgendwie funzt das so nicht (das Bild ist nu weg) ... hmm, werd ich aber weiter testen. Dzt. zeigt es mir dann das:
Code:
Text "blabla" vorm Bild
width="100" height="100"
und mehr "blabla".
Tja, dh. ich muß da noch viel lernen um solche Ausdrücke wie den voll zu kapieren ...


So sieht das jetzt aus:
PHP-Code:
$eingabe 'Text "<em>blabla</em>" vorm Bild <br /><img src="bild.jpg" width="320" height="240" /><br />und mehr "<em>blabla</em>".';
#$pattern = '#width="(.*)" height="(.*)"#'; // NACH-folgender Text in "" zerstört alles
#$pattern = '#width="(.*)" height="(.*)"#U'; // so gehts ... aber ist das echt DIE Lösung ??
#$pattern = '#width="(.*)" height="(.*)"#s'; // will auch nicht ...
$pattern '/<img[^>]*width="([^"]*)"[^>]*height="([^"]*)"[^>]*\/?>/s'// Tip aus php-resource-forum(user mermshaus)
$replace 'width="100" height="100"';
$ausgabe preg_replace($pattern,$replace,$eingabe);
echo 
$ausgabe


Zitat:
1: Auch das ist wahrscheinlich noch mit einem regulären Ausdruck hinzubiegen (wenn der Attributname auch zurückgeliefert wird), aber irgendwann wird es dann albern.
Glaub ich auch - nur da die Attribute eh so bleiben erübrigt sich das erstmal

Geändert von [pezi] (04-06-2011 um 02:50 Uhr)
Mit Zitat antworten
  #4 (permalink)  
Alt 04-06-2011, 04:12
Benutzerbild von mermshaus mermshaus
 Registrierter Benutzer
Links : Onlinestatus : mermshaus ist offline
Registriert seit: Jun 2009
Beiträge: 451
mermshaus wird schon bald berühmt werden
Standard

Ja, mein Ausdruck war nicht als Pattern für preg_replace gedacht.

Ich habe ihn noch verbessert (auch dahingehend) und kommentiert:

PHP-Code:
header('Content-Type: text/plain; charset=UTF-8');

$eingabe 'Text "<em>blabla</em>" vorm Bild <br /><img src="bild.jpg" class="xy" width="320" height="240" /><br />und mehr "<em>blabla</em>".
    Text "<em>blabla</em>" vorm Bild <br /><img src="bild2.jpg" class="xy" width="800" height="600" /><br />und mehr "<em>blabla</em>".'
;

$pattern '!
             (<img\s[^>]*width=") # Finde [<img]
                                  # + [ein Whitespace-Zeichen]
                                  # + [beliebig viele Zeichen ungleich >]
                                  # + [width="]
                                  # Speichere diesen Teilstring in $1
                                  #   Beispiel: [<img src="bild.jpg" width="]

             (?:[^"]*)            # Finde [beliebig viele Zeichen ungleich "]
                                  # Verwerfe diesen Teilstring
                                  #   Beispiel: [320]

             ("\s[^>]*height=")   # Finde ["]
                                  # + [ein Whitespace-Zeichen]
                                  # + [beliebig viele Zeichen ungleich >]
                                  # + [height="]
                                  # Speichere diesen Teilstring in $2
                                  #   Beispiel: [" height="]

             (?:[^"]*)            # Finde [beliebig viele Zeichen ungleich "]
                                  # Verwerfe diesen Teilstring
                                  #   Beispiel: [240]

             ("[^>]*/?>)          # Finde ["]
                                  # + [beliebig viele Zeichen ungleich >]
                                  # + [optional ein /]
                                  # + [>]
                                  # Speichere diesen Teilstring in $3
                                  #   Beispiel: [" />]
            !x'
;

$replace '${1}100${2}100$3';
                             
// Konkateniere: [$1] + [100] + [$2] + [100] + [$3]

$ausgabe preg_replace($pattern,$replace,$eingabe);

echo 
$ausgabe
Aber… Puh, nein, im Ernst: Nimm das höchstens als generelle Erklärungen. Reguläre Ausdrücke eignen sich dazu einfach nicht (besonders gut). Ich spare es mir deshalb auch, die „Vorteile“ gegenüber dem nächsten Pattern aufzuzeigen.

Mach lieber sowas, wenn du auf Regex setzen willst:

PHP-Code:
<?php

header
('Content-Type: text/plain; charset=UTF-8');

$eingabe 'Text "<em>blabla</em>" vorm Bild <br /><img src="bild.jpg" class="xy" width="320" height="240" /><br />und mehr "<em>blabla</em>".
    Text "<em>blabla</em>" vorm Bild <br /><img src="bild2.jpg" class="xy" width="800" height="600" /><br />und mehr "<em>blabla</em>".'
;

$pattern '!
             <img              # Finde [<img]
             \s+               # Finde [mindestens ein Whitespace-Zeichen]

             src="([^"]*)"     # Finde [src="]
                               # + [beliebig viele Zeichen ungleich "]
                               # + ["]
                               # Speichere Zeichen zwischen " und " in $1

             [^>]*             # Finde [beliebig viele Zeichen ungleich [>]
             /?>               # Finde [optional ein /] + [>]
            !x'
;

$replace '<img src="$1" height="100" width="100" />';

$ausgabe preg_replace($pattern,$replace,$eingabe);

echo 
$ausgabe;
Mit Zitat antworten
  #5 (permalink)  
Alt 04-06-2011, 10:05
AmicaNoctis
  Moderatorin
Links : Onlinestatus : AmicaNoctis ist offline
Registriert seit: Jul 2009
Beiträge: 5.709
Blog-Einträge: 9
AmicaNoctis sorgt für eine eindrucksvolle AtmosphäreAmicaNoctis sorgt für eine eindrucksvolle Atmosphäre
Standard

Hallo,

warum quälst du dich überhaupt mit Regex rum, wenn es doch viel bessere Möglichkeiten gibt, HTML zu verarbeiten?

PHP-Code:
$doc = new DomDocument();
$eingabe 'Text "<em>blabla</em>" vorm Bild <br /><img src="bild.jpg" width="320" height="240" /><br />und mehr "<em>blabla</em>".';
$ausgabe "";
$doc->loadXml("<div>" $eingabe "</div>");
foreach (
$doc->getElementsByTagName("img") as $img) {
    
$img->setAttribute("width"100);
    
$img->setAttribute("height"100);
}
foreach (
$doc->documentElement->childNodes as $child) {
    
$ausgabe .= $doc->saveXml($child);
}
echo 
$ausgabe
Gruß,

Amica
__________________
Hast du die Grundlagen zur Fehlersuche gelesen? Hast du Code-Tags benutzt?
Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
Super, danke!

Geändert von AmicaNoctis (04-06-2011 um 10:23 Uhr)
Mit Zitat antworten
  #6 (permalink)  
Alt 04-06-2011, 10:56
[pezi]
 Registrierter Benutzer
Links : Onlinestatus : [pezi] ist offline
Registriert seit: Aug 2002
Beiträge: 7
[pezi] ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
Zitat von mermshaus Beitrag anzeigen
Ja, mein Ausdruck war nicht als Pattern für preg_replace gedacht.
hab ich dann auch bemerkt das es nur zur Infoausgabe war... Ausserdem , eh klar das bild.jpg nicht erscheint wenn ein Text-Header drin ist, naja, altwerd ...

Zitat:
Nimm das höchstens als generelle Erklärungen. Reguläre Ausdrücke eignen sich dazu einfach nicht (besonders gut).
ich werd das am WE alles durchackern, es ist echt gut kommentiert, genau die Erklärung die ich brauch um wieder mal REGEX aufzufrischen!

Danke !
Mit Zitat antworten
  #7 (permalink)  
Alt 04-06-2011, 11:09
[pezi]
 Registrierter Benutzer
Links : Onlinestatus : [pezi] ist offline
Registriert seit: Aug 2002
Beiträge: 7
[pezi] ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
Zitat von AmicaNoctis Beitrag anzeigen
Hallo, warum quälst du dich überhaupt mit Regex rum, wenn es doch viel bessere Möglichkeiten gibt, HTML zu verarbeiten?
PHP-Code:
$doc = new DomDocument(); 
Danke auch dir, das funzt natürlich auch gut. Und wurde mir ja auch von mermshaus vorgeschlagen.
Und wieder was zum lernen - denn damit kenn ich mich noch weniger aus als mit Regex ...

Eigentlich "quäle" ich mich mehr aus Testzwecken damit, es gäbe für das Problemchen eh noch andere Möglichkeiten - denn Bilder nur im Quelltext zu skalieren ist sowiso eher sinnfrei. Wie gesagt diese Bildmaß Änderungen nahm ich als Anlass zu schauen ob ich das per Regex überhaupt machen könnte.
Mit Zitat antworten
Antwort

Lesezeichen

Stichworte
modifier, regex


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

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
[REGEX]preg_replace modifier & Code Ausführung teco2008 PHP Developer Forum 12 07-03-2010 10:03
[REGEX] Unknown modifier ',' in Theed PHP Developer Forum 4 01-05-2007 18:52
[JavaScript] [RegEx] g Modifier Luke HTML, JavaScript, AJAX, jQuery, CSS, Bootstrap, LESS 3 22-05-2006 13:22
[REGEX] Problem mit Modifier (/i) Crake PHP Developer Forum 11 31-07-2004 21:11
Wer wirklich einen innovativen Programmierer sucht, der schaut hier dhcomputer Jobgesuche 0 04-03-2004 13:33

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 09:25 Uhr.