php.de

Zurück   php.de > Webentwicklung > PHP-Fortgeschrittene

PHP-Fortgeschrittene Arbeiten mit PHP ohne Einschränkungen

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 19.09.2006, 23:41  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 35.987
PHP-Kenntnisse:
Fortgeschritten
nikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunft
Standard Parsen von Delimitern

Hallo,
ich suche eine elegante + effiziente Lösung für folgendes, vielleicht öfter auftauchendes Problem:

! Suche in einem beliebigen String alle Zeichen X (z.B. ein Komma). Trenne diesen String dort oder tue etwas ähnliches. Übergehe dabei Zeichen die innerhalb eines Stringdelimiters stehen.
Die Problemstellung liegt im letzten Satz. Spontan fallen mir diese Ansätze ein:

- ersetze die Kommata in Stringdelims vorübergehend durch einen geeigneten reg. Ausdruck in ein Zeichen oder eine Zeichenkette, die nicht im Text vorkommt. Trenne dann und ersetze zurück.

- speichere alle Positionen von Komma, dasselbe mit einem reg. Ausruck der nur Kommata innerhalb des Delimiters findet. Das array_diff dieser Arrays bildet die Stellen, an der ich den String trennen muß. Das wär wohl die beste, das Problem: mir ist keine Funktion bekannt, die nur Fundpositionen eines regulären Ausdrucks zurückgibt, nicht aber die Werte selbst.

- trenne den Text per preg_split(), einem Ausdruck der alle gültigen String-Delimiter mit Inhalt beinhaltet als Trennstring und dem Parameter PREG_SPLIT_DELIM_CAPTURE. Spalte diejenigen Arrayelemente, die nicht mit dem Delimiter beginnen wiederum nach Komma auf und setze das ganze dann neu zusammen.
Dafür gibts hier mal n Konstrukt, stört euch bitte nicht an dem Ausgangsstring, das ist nur n Beispiel!

PHP-Code:
$string 'Bitte gib [div style="fett , rot"]Name, Vorname, Alter[/div] an, am besten [div style="rot, blinkend"]hier[/div]';
$x preg_split('/(\"[^"]*?\")/' $string , -PREG_SPLIT_DELIM_CAPTURE PREG_SPLIT_NO_EMPTY);

/*
    [0] => Bitte gib [div style=
    [1] => "fett , rot"
    [2] => ]Name, Vorname, Alter[/div] an, am besten [div style=
    [3] => "rot, blinkend"
    [4] => ]hier[/div]
*/

foreach($x as $k => $current)
  {
  if(
$current{0}=='"') continue;

  
$p explode(',' $current);
  if (isset(
$x[$k-1]) && !is_array($x[$k-1])) $x[$k-1] .= array_shift($p);
  if (isset(
$x[$k+1]) && !is_array($x[$k+1])) $x[$k+1]  = array_pop($p).$x[$k+1];
  
$x[$k]= $p;
  }

/*
    [0] => Array
        (
        )

    [1] => Bitte gib [div style="fett , rot"]Name
    [2] => Array
        (
            [0] =>  Vorname
            [1] =>  Alter[/div] an
        )

    [3] =>  am besten [div style="rot, blinkend"]hier[/div]
    [4] => Array
        (
        )
*/

foreach($x as $k => $current)
  {
  foreach((array) 
$x[$k] as $entry$x[] = $entry;
  unset(
$x[$k]);
  }

/*
    [5] => Bitte gib [div style="fett , rot"]Name
    [6] =>  Vorname
    [7] =>  Alter[/div] an
    [8] =>  am besten [div style="rot, blinkend"]hier[/div]
*/ 
Obgleich es funktioniert ists furchtbar umständlich. Hat jemand ne andere Idee, z.B. aus Zeiten in denen er versucht hat seinen eigenen Parser zu schreiben??

Danke im Voraus... --n
nikosch ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 20.09.2006, 15:58  
Erfahrener Benutzer
 
Benutzerbild von Andreas
 
Registriert seit: 22.04.2005
Beiträge: 391
Andreas ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Schonmal dran gedacht, den string zeichen für zeichen zu durchlaufen?
Etwa so?
Ist nur so hingefummelt, da kann man sicher einiges optimieren.

PHP-Code:
<?php
$string 
'Bitte gib [div style="fett , rot"]Name, Vorname, Alter[/div] an, am besten [div style="rot, blinkend"]hier[/div]';


$aTeile            = array();
$puffer         "";
$zeichen         ",";
$uebergehen     false;



for(
$i=0;$i<strlen($string);$i++) {
    
    if(
$string[$i]=="[") {
        
$uebergehen true;
        
$puffer.= $string[$i];
        continue;
    }
    
    if(
$string[$i]=="]") {
        
$uebergehen false;
        
$puffer.= $string[$i];
        continue;        
    }
    
    if(
$uebergehen) {
        
$puffer.=$string[$i];
        continue;
    }

    
    if(
$string[$i]==$zeichen) {
        
array_push($aTeile$puffer);
        
$puffer "";    
    }
    
$puffer.= $string[$i];
    
}
array_push($aTeile$puffer);

print_r($aTeile);
?>
Andreas ist offline   Mit Zitat antworten
Alt 21.09.2006, 07:57  
Erfahrener Benutzer
 
Registriert seit: 03.01.2006
Beiträge: 253
CC84
Standard

Bin mir nicht sicher, ob ich dich richtig verstehe, aber schau mal bei den Tutorials in mein Tutorial für den BBCode, die Problemstellung ist glaube ähnlich und die von mir benutze Methode müsste von dir nur bisschen anders eingesetzt werden. Habe da auch erklärt was für Arrays preg_match_all zurück gibt, das sollte dir helfen.

Gruß

CC
CC84 ist offline   Mit Zitat antworten
Alt 21.09.2006, 21:50  
Erfahrener Benutzer
 
Registriert seit: 18.07.2004
Beiträge: 2.162
PHP-Kenntnisse:
Fortgeschritten
Basti
Standard Re: Parsen von Delimitern

Zitat:
Zitat von nikosch77
Übergehe dabei Zeichen die innerhalb eines Stringdelimiters stehen.
Die Problemstellung liegt im letzten Satz.
...und wir sollen die jetzt suchen, oder was meinst du? Was denn für Zeichen innerhalb des "Delimiters". Wenn dieser ein Komma ist, was für Zeichen sollen denn dann in diesem Komma stehen (die Buchstaben K-o-m-m-a vielleicht *g)?

Sag doch einfach mal, was du konkret möchtest. Willst du ein Array mit allen Werten die als Style-Attribut genannt sind?

Basti
Basti ist offline   Mit Zitat antworten
Alt 22.09.2006, 14:54  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 35.987
PHP-Kenntnisse:
Fortgeschritten
nikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunft
Standard keiner versteht mich... ;)

Sorry, klingt reichlich kryptisch, ists aber gar nicht. 'ZEICHENKETTENBEGRENZER' (extra für Basti) wie das einfache Hochkomma, oder ein BBCode Tag oder ein mehrzeiliger /* */ Kommentar, was auch immer definiert wurde, und deren Inhalte sollen quasi ignoriert werden. Nur der restliche Text soll nach einem Suchstring/character aufgeteilt werden (das Komma in diesem Fall). Verstanden? Die Sachlage ist also genau umgedreht. Zudem wird die öffnende und schließende Attributgrenze vom gleichen Zeichen gebildet: '

preg_match_all ist mir durchaus geläufig, matcht aber eben nur die Teile die bei mir ignoriert werden sollen, aber keine Bereiche die nicht darauf zutreffen. Außerdem suche ich nicht die Zeichenkette, sondern möchte den String dort trennen, ist also mit Kanonen auf Spatzen. Da ist das zeichenweise durchlaufen schon besser, wird nur bei Zeichenkettenbegrenzern aus mehr als einem Zeichen knifflig. Z.B. um folgende Zeichenkette an den Kommata im Code umzubrechen, nicht aber hinter 'mehr':

Zitat:
$code = '
$array1 = array(5,10,20);
/* Hier passiert mehr, aufgepaßt ! */
$array2 = array(10,20,42);';
Ums konkret zu machen, ich möchte eine Zeichenkette von Kommandos in einzelne aufteilen:

Zitat:
$commands ="
reduce to '%artist%' matches 'Beatsteaks' or 'Bad Religion' ;
reduce to '%track%' matches 'I\'ve been looking for' ;
set reduce to '%artist%' matches pattern 'Bri~' ; set output to '
%artist%; <- Hier lauert das Problem %album%'
";
Geteilt werden soll z.B. nach ; und Zeilenumbruch, ohne Bereiche in Hochkommata in verschiedene Arrayelemente zu verteilen. Um das Chaos perfekt zu machen, sollen auch qequotete ' innerhalb von '' zugelassen werden. Ich suche aber natürlich möglichst eine allgemeingültige Lösung als eine, die unflexibel auf genau diese Konfiguration zugeschnitten ist.

Ich beiß mir auch nochmal die Zähne dran aus.
Grusz --77
nikosch ist offline   Mit Zitat antworten
Alt 22.09.2006, 15:24  
Erfahrener Benutzer
 
Registriert seit: 18.07.2004
Beiträge: 2.162
PHP-Kenntnisse:
Fortgeschritten
Basti
Standard

Ich glaub, das Stichwort heißt kontextsensitiver Parser, oder? *g

Ein Weg wäre vielleicht mit preg_split den Text an den unescapten Hochkommata aufzutrennen und diese durch öffnenden und schließende Tags zu ersetzen. Damit kannst du dann mit preg_replace die Semikola innerhalb der Hochkommata escapen und dann eben alles anhand der unescapten Semikola auftrennen.

Denkbar sicherlich auch, das ganze in einen DOM-Baum zu packen.

Basti
Basti ist offline   Mit Zitat antworten
Antwort


Themen-Optionen
Thema bewerten
Thema bewerten:

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 an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Dynamische HTML Seite parsen blaus PHP Tipps 2008 10 17.03.2008 14:44
XML parsen und Umlaute betterknower PHP Tipps 2008 6 31.12.2007 18:35
Parsen von Delimitern Basti Tutorials 0 30.09.2006 21:24
geht das mit parsen?? Dopedouglaz PHP Tipps 2006 6 22.05.2006 14:13
Keine Endung Parsen? andy Server, Hosting und Workstations 3 07.03.2006 14:43
Datei Uploaden & Parsen PHP Tipps 2007 7 04.11.2005 20:51
[Erledigt] XML-Datei direkt von FTP-Quelle parsen PHP-Fortgeschrittene 10 04.11.2005 16:12
text parsen mit php - tutorial gesucht PHP Tipps 2005-2 2 05.10.2005 11:44
[TEMPLATEENGINE] Problem mit dem Parsen von Arrays imported_Ben PHP-Fortgeschrittene 5 30.07.2005 11:07
Klasse oder php_xyz.dll zum Parsen einer Mail tapferesschneiderlein PHP Tipps 2005 5 20.03.2005 15:12
Suchstring parsen PHP Tipps 2005 4 04.01.2005 23:29
[RegEx] Datum/Uhrzeit parsen PHP-Fortgeschrittene 3 08.11.2004 08:58
XML parsen und Probleme mit "&"-Zeichen. PHP Tipps 2004 3 16.10.2004 13:54
[Erledigt] Parsen von Variablen aus einer MySQL Tabellenzeile Datenbanken 0 29.09.2004 14:58
XML parsen mit DOM PHP-Fortgeschrittene 2 24.09.2004 13:59

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
div parsen php, php altersdiv, php string nach komma parsen, php effizient parsen, php parser string, div parsen, php reguläre ausdrücke parsen komma trennen, php div parser, php string eot problem, preg_split zeilenumbruch, php textumbruch bei komma, php string parsen vorname name trennen, php <div> parsen, php parser buchstabe g fehler, php kommas erzestzen aber nur außerhalb von strings, php string nach x parsen, div preg_split, match javascript parsen von delimitern, 2 divs preg_split php, php string trennen anhand fettdrucks

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




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum

Creative Commons License
Dieser Inhalt ist unter einer Creative Commons-Lizenz lizenziert.