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 (1) Themen-Optionen Thema bewerten
  1 links from elsewhere to this Post. Click to view. #1 (permalink)  
Alt 01-10-2010, 12:13
RossiRat
 Registrierter Benutzer
Links : Onlinestatus : RossiRat ist offline
Registriert seit: Oct 2010
Beiträge: 9
RossiRat befindet sich auf einem aufstrebenden Ast
Lightbulb *GELÖST* [Regexp] define Befehle aus Quelltext Dateien parsen

Für ein Übersetzungsprojekt stehe ich vor folgendem Problem:

Ich möchte per PHP die xtc:modify Shop Sprachdateien parsen und habe mir dafür schon ein Regexp ersonnen:
Code:
define\(["']([^"']+)["'][ ]*,[ ]*(.*)\);([ ]*[\/]*.*)
Der Ausdruck würde eine Zeile in die Bezeichnung eines PHP define Befehl, dessen Inhalt und evtl. vorhandene Bemerkung zerlegen. Klappt in Tests auch schon prima.

PHP-Code:
define('TITLE'STORE_NAME);
define('DATE_FORMAT_SHORT','(*); %d.%m.%Y');  // this is used for strftime() 
wird zu

PHP-Code:
TITLE => STORE_NAME
DATE_FORMAT_SHORT 
=> '(*);*%d.%m.%Y'   Bemerkung// this is used for strftime() 
Jetzt meine Frage: Wie kann ich den Ausdruck sicher für mehrzeilige define Befehle gestalten? Da hapert es etwas bei mir.

PHP-Code:
define('DATE_FORMAT_SHORT',
    
'%d.%m.%Y');// Mehrzeilig geht leider nicht :( 
Als PHP Befehl möchte ich preg_match_all verwenden. Welche Modifikatoren und Ausdruck-Änderungen muss ich für die mehrzeilige Suche verwenden?

Vielen Dank schonmal für Eure Tipps.

Geändert von RossiRat (18-03-2011 um 16:16 Uhr) Grund: Gelöst eingefügt
Mit Zitat antworten
  #2 (permalink)  
Alt 01-10-2010, 12:56
boeserfrosch
 Registrierter Benutzer
Links : Onlinestatus : boeserfrosch ist offline
Registriert seit: Nov 2009
Beiträge: 93
boeserfrosch befindet sich auf einem aufstrebenden Ast
Standard

ich hab zwar mit regulären ausdrücken noch nicht so gearbeitet aber so wie ich das verstehe benötigst du den modifier "m"
Mit Zitat antworten
  #3 (permalink)  
Alt 01-10-2010, 13:05
Benutzerbild von ApoY2k ApoY2k
 Registrierter Benutzer
Links : Onlinestatus : ApoY2k ist offline
Registriert seit: Nov 2006
Beiträge: 359
ApoY2k befindet sich auf einem aufstrebenden Ast
ApoY2k eine Nachricht über ICQ schicken ApoY2k eine Nachricht über Skype™ schicken
Standard

Was sollen die [*]* bewirken? Der Befehl define('CONST'*, 'Text'); führt zu einem Parse error. Was willst du da abfangen?

Versuchs mal damit, \s* vor und nach das Komma und die Klammern zu setzen, dann bist du auf der sicheren Seite.
__________________
This is what happens when an unstoppable force meets an immovable object.
Mit Zitat antworten
  #4 (permalink)  
Alt 01-10-2010, 13:59
RossiRat
 Registrierter Benutzer
Links : Onlinestatus : RossiRat ist offline
Registriert seit: Oct 2010
Beiträge: 9
RossiRat befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von ApoY2k Beitrag anzeigen
Was sollen die [*]* bewirken? Der Befehl define('CONST'*, 'Text'); führt zu einem Parse error. Was willst du da abfangen?

Versuchs mal damit, \s* vor und nach das Komma und die Klammern zu setzen, dann bist du auf der sicheren Seite.
Entschuldige bitte, irgendwie sind beim Reinkopieren aus Leerzeichen Sternchen geworden?!?

Ich habe den Ausdruck berichtigt. Hier noch mal zur besseren Ansicht:
Code:
define\(["']([^"']+)["'][ ]*,[ ]*(.*)\);([ ]*[\/]*.*)
Die [ ]* benutze ich um beliebig viele Leerzeichen zu finden. Man kann zwar das Leerzeichen auch setzen ohne eine Klasse mit den Klammern zu machen. Aber ich habe mir das mal so angewöhnt, da man so nicht so schnell ein Leerzeichen übersehen kann.

Wenn ich den /m Modifikator (Multiline) setze, dann werden alle Zeilen bis zum Ende der Datei als eine Zeile gefunden. Da müsste irgendwie noch eine Abfrage rein das er Multiline nutzt aber bei define einen neuen Datensatz anfängt. Und das kriege ich nicht hin.

Edit:
Ausdruck endlich richtig reinkopiert!

Geändert von RossiRat (01-10-2010 um 14:11 Uhr)
Mit Zitat antworten
  #5 (permalink)  
Alt 01-10-2010, 14:08
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,

du kannst auch PHPs eingebauten Tokenizer nutzen. Das ist zuverlässiger als selbgestrickte RegExe.

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!
Mit Zitat antworten
  #6 (permalink)  
Alt 01-10-2010, 14:29
Benutzerbild von ApoY2k ApoY2k
 Registrierter Benutzer
Links : Onlinestatus : ApoY2k ist offline
Registriert seit: Nov 2006
Beiträge: 359
ApoY2k befindet sich auf einem aufstrebenden Ast
ApoY2k eine Nachricht über ICQ schicken ApoY2k eine Nachricht über Skype™ schicken
Standard

Eine neue Zeile ist kein Leerzeichen. Wenn du neue Zeilen einbinden willst, musst du dem Ausdruck das auch mitteilen.

PHP-Code:
preg_match_all('#define\s*\(\s*["\']([^"\']+)["\']\s*,\s*(.*)\s*\); *(//.*)*#'$define$matches); 
__________________
This is what happens when an unstoppable force meets an immovable object.

Geändert von ApoY2k (01-10-2010 um 14:43 Uhr)
Mit Zitat antworten
  #7 (permalink)  
Alt 01-10-2010, 15:36
RossiRat
 Registrierter Benutzer
Links : Onlinestatus : RossiRat ist offline
Registriert seit: Oct 2010
Beiträge: 9
RossiRat befindet sich auf einem aufstrebenden Ast
Thumbs up

Zitat:
Zitat von ApoY2k
Eine neue Zeile ist kein Leerzeichen. Wenn du neue Zeilen einbinden willst, musst du dem Ausdruck das auch mitteilen.
Genau das war mein Problem. Ich hatte es auch schon mit \n probiert. Hatte wohl einen leichten Knoten im Gehirn.

Zitat:
Zitat von ApoY2k
PHP-Code:
preg_match_all('#define\s*\(\s*["\']([^"\']+)["\']\s*,\s*(.*)\s*\); *(//.*)*#'$define$matches); 
Funktioniert prima! Vielen Dank Apo!


@Amica
Der Tokenizer hört sich sehr interessant an. Damit habe ich noch nicht gearbeitet. Aber wenn der PHP Befehl define nicht in der Tokenliste drin steht, kann ich dann trotzdem den Tokenizer nutzen?

Geändert von RossiRat (01-10-2010 um 15:38 Uhr)
Mit Zitat antworten
  #8 (permalink)  
Alt 01-10-2010, 15:43
wahsaga
  Moderator
Links : Onlinestatus : wahsaga ist offline
Registriert seit: Sep 2001
Beiträge: 25.236
wahsaga befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von RossiRat Beitrag anzeigen
Der Tokenizer hört sich sehr interessant an. Damit habe ich noch nicht gearbeitet. Aber wenn der PHP Befehl define nicht in der Tokenliste drin steht, kann ich dann trotzdem den Tokenizer nutzen?
define ist eine Funktion, wird also auch als solche vom Tokenizer erkannt.
__________________
I don't believe in rebirth. Actually, I never did in my whole lives.
Mit Zitat antworten
  #9 (permalink)  
Alt 01-10-2010, 15:53
Benutzerbild von ApoY2k ApoY2k
 Registrierter Benutzer
Links : Onlinestatus : ApoY2k ist offline
Registriert seit: Nov 2006
Beiträge: 359
ApoY2k befindet sich auf einem aufstrebenden Ast
ApoY2k eine Nachricht über ICQ schicken ApoY2k eine Nachricht über Skype™ schicken
Standard

Habe den Tokenizer mal getestet und mir ist dabei aufgefallen, dass, wenn der define über mehrere Zeilen geht, die neuen Zeilen als Token registriert werden. Mit anderen Worten, wenn man

PHP-Code:
define('const','text'); 
In Tokens umwandelt, erhält man

PHP-Code:
=> define
=> (
=> 'const'
=> ,
=> 'text'
=> )
=> ; 
(Vereinfacht dargestellt)

Wenn man hingegen
PHP-Code:
define('const',
'text'); 
umwandelt, wird daraus

PHP-Code:
=> define
=> (
=> 'const'
=> ,
=>

=> 'text'
=> )
=> ; 
Das gleiche passiert auch bei Leerzeichen

PHP-Code:
define('const''text'); 
wird zu

PHP-Code:
=> define
=> (
=> 'const'
=> ,
=>
=> 'text'
=> )
=> ; 
__________________
This is what happens when an unstoppable force meets an immovable object.
Mit Zitat antworten
  #10 (permalink)  
Alt 01-10-2010, 16:02
wahsaga
  Moderator
Links : Onlinestatus : wahsaga ist offline
Registriert seit: Sep 2001
Beiträge: 25.236
wahsaga befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von ApoY2k Beitrag anzeigen
Habe den Tokenizer mal getestet und mir ist dabei aufgefallen, dass, wenn der define über mehrere Zeilen geht, die neuen Zeilen als Token registriert werden.
Ja - und was willst du uns jetzt damit sagen ...?

Zeilenumbrüche und Leerzeichen stellen nun mal Token vom Typ T_WHITESPACE dar.
__________________
I don't believe in rebirth. Actually, I never did in my whole lives.
Mit Zitat antworten
  #11 (permalink)  
Alt 01-10-2010, 17:35
Benutzerbild von ApoY2k ApoY2k
 Registrierter Benutzer
Links : Onlinestatus : ApoY2k ist offline
Registriert seit: Nov 2006
Beiträge: 359
ApoY2k befindet sich auf einem aufstrebenden Ast
ApoY2k eine Nachricht über ICQ schicken ApoY2k eine Nachricht über Skype™ schicken
Standard

Naja, wie soll man rausfinden auf welche Felder man zugreifen soll, um an die Daten, die man möchte zu kommen? Mal ist es 5, mal 6.
__________________
This is what happens when an unstoppable force meets an immovable object.
Mit Zitat antworten
  #12 (permalink)  
Alt 01-10-2010, 19:01
wahsaga
  Moderator
Links : Onlinestatus : wahsaga ist offline
Registriert seit: Sep 2001
Beiträge: 25.236
wahsaga befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von ApoY2k Beitrag anzeigen
Naja, wie soll man rausfinden auf welche Felder man zugreifen soll, um an die Daten, die man möchte zu kommen? Mal ist es 5, mal 6.
Mal enthält der Code an der Stelle ja auch Whitespace, und mal nicht ...

Und für die Tokens wird jeweils ein Array geliefert, in dem auch der Typ explizit aufgeführt ist. Was kein Arrays ist, ist auch kein Token, sondern sonstiges (Syntax-)Zeichen.
__________________
I don't believe in rebirth. Actually, I never did in my whole lives.
Mit Zitat antworten
  #13 (permalink)  
Alt 01-10-2010, 21:13
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

Das Problem mit dem Tokenizer ist, dass er auch nur Mustererkennung macht, aber er "parst" nicht. Wenn jetzt die Ausdrücke, die define() übergeben werden, komplexer sind, als bspw. zwei skalare Werte, muss man sich selbst einen Parser stricken. Man denke nur an durch Klammern verschachtelte Ausdrücke ...

Also ist der Tokenizer auch nicht viel mehr wert als ein bisschen preg_match() mit einem etwas größeren RegEx.

Zitat:
Zitat von RossiRat
...
Der Ausdruck würde eine Zeile in die Bezeichnung eines PHP define Befehl, dessen Inhalt und evtl. vorhandene Bemerkung zerlegen. Klappt in Tests auch schon prima.
...
Jetzt meine Frage: Wie kann ich den Ausdruck sicher für mehrzeilige define Befehle gestalten?
Ersetze alle Stellen, an denen im Quelltext ein Leer- oder Zeilentrennzeichen auftreten könnte (das sind so einige) durch so etwas wie '\s*' oder '\s+' (je nachdem, was der PHP-Parser für zulässig erachtet). Und weil du den Punkt|Dot '.' als Musterzeichen verwendest, gehört ein '/s' (== "dot all") hinter den RegEx, denn String-Literale können in PHP-Quelltexten auch über mehrere Zeilen gehen.

Was willst du eigentlich "parsen"? Willst du nur ein paar Daten extrahieren oder den Quellcode modifizieren?

PHP-Code:
preg_match_all(
    
'/\s*define\s*\(\s*'.
    
'\'([^\']+)\'\s*,\s*'.
    
'\'([^\']+)\''.
    
'\s*\)\s*;\s*'.
    
'//([^\r\n]+)/sx'
    
$src
    
$hits
); 
Das sollte dir den Kommentar und die beiden Zeichenketten zeigen, die define() übergeben wurden.

Um das Ganze aber solider zu machen, muss man noch die Erkennung der "Hochkommas" verfeinern (es fehlen die doppelten) und berücksichtigen, dass das gesamte Muster auch in (ein und mehrzeiligen) Kommentaren und String-Literalen vorkommen darf, dort sollte es aber ignoriert werden.

Geändert von fireweasel (01-10-2010 um 21:19 Uhr)
Mit Zitat antworten
  #14 (permalink)  
Alt 02-10-2010, 08:35
RossiRat
 Registrierter Benutzer
Links : Onlinestatus : RossiRat ist offline
Registriert seit: Oct 2010
Beiträge: 9
RossiRat befindet sich auf einem aufstrebenden Ast
Standard

Vielen vielen Dank für Eure Hilfe! Bisher habe ich eher mit einfachen RegEx gearbeitet.

Ich bin gerade dabei mir einen neuen modify Shop einzurichten. Dabei habe ich feststellen müssen das einige Übersetzungen leider noch nicht vollständig vorhanden sind. Dazu möchte ich ein Unterstützungs-Tool programmieren.

Ich parse die Originale xtc_modify Sprachdatei in Deutsch und lege eine Tabelle mit den Schlüsseln und Werten an. Danach werden die anderen installierten Sprachen geparst und an die vorhandenen Schlüssel angehängt. Am Ende bekommt man etwas präsentiert was wie eine Excel Tabelle aussieht, in der man sofort erkennt welche Schlüssel noch nicht übersetzt sind.
Mit Zitat antworten
  #15 (permalink)  
Alt 03-10-2010, 22:34
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

Zitat:
Zitat von RossiRat Beitrag anzeigen
Vielen vielen Dank für Eure Hilfe! Bisher habe ich eher mit einfachen RegEx gearbeitet.
Oh, mein Vorschlag war ein einfacher RegEx: ein wenig Pattern-Matching, nicht mehr. Er sieht nur so komisch aus, weil an jeder möglichen Stelle ein '\s*' eingefügt wurde, um auch alle (Stellen) zu erfassen, wo der PHP-Parser beim Übersetzen eines Scriptes Leerzeichen erlaubt. '\s' steht für "white space" und erfasst auch Tabulator-Zeichen, Zeilenumbrüche usw.

Zitat:

Ich bin gerade dabei mir einen neuen modify Shop einzurichten. Dabei habe ich feststellen müssen das einige Übersetzungen leider noch nicht vollständig vorhanden sind. Dazu möchte ich ein Unterstützungs-Tool programmieren.
Ohne Not sollte man sich keine Arbeit machen, die schon andere getan haben ...

Ein größeres Open-Source-Projekt, das was taugt, benutzt für die Lokalisierung üblicherweise ein weitverbreitetes Standardwerkzeug oder bietet wenigstens ein eigenes an. Hat xtc:modify keines? Das wäre (für mich) ein schlechtes Zeichen. Oder benutzt es das gleiche Lokalisierungsformat wie sein Ursprungsprojekt xt-commerce?

Geändert von fireweasel (03-10-2010 um 22:37 Uhr)
Mit Zitat antworten
Antwort

Lesezeichen

Stichworte
mehrzeilig, regexp


LinkBacks (?)
LinkBack to this Thread: https://www.php-resource.de/forum/php-developer-forum/100379-regexp-define-befehle-aus-quelltext-dateien-parsen.html
Erstellt von For Type Datum
PHP Frage: regexp auf xtc:modify Sprachdateien anwenden • sellerforum.de - Das Händlerforum für den Versandhandel - Themen: eBay, Shopsysteme, Abmahnungen uvm! This thread Refback 25-03-2012 19:34

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

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
define ist leer! der_meier_hans PHP Developer Forum 1 24-05-2008 15:15
7MB XML Dateien parsen mab82 PHP Developer Forum 4 03-08-2006 18:18
Quelltext anderer Dateien Bors-T PHP Developer Forum 1 06-04-2005 17:46
html dateien mit php parsen ? ilch Webmaster 4 20-04-2004 12:09
Doc-Dateien parsen Krusenbaum Apps und PHP Script Gesuche 4 16-07-2002 15:05

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 04:34 Uhr.