| 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! Post your PHP questions here! |
 |

30-05-2010, 16:53
|
|
tr-oo-per
Registrierter Benutzer
|
|
Registriert seit: May 2010
Ort: at work
Beiträge: 32
|
|
Regulärer Ausdruck gesucht
Folgendes Problem: ich möchte eine Zeichenkette hinsichtlich gepaarter Ausdrücke durchsuchen.
Code:
$string = "
{begin:section1}
Text
{end:sectionX1}
Text
{begin:section2}
Text
{begin:section21}
Text
{end:section21}
Text
{end:section2}
Text
";
$pattern = ???;
$matches = array();
$n = preg_match_all($pattern, $string, $matches);
Ich kenne die Namen im Vornherein nicht, kann mich bestenfalls auf die Teilstrings "begin:" und "end:" verlassen.
Gruß,
tr-oo-per
|

30-05-2010, 17:18
|
|
Piremilok
Registrierter Benutzer
|
|
Registriert seit: Jul 2006
Beiträge: 95
|
|
Hi,
wenn du selbst die Namen nicht genau kennst, dann würde ich erstmal eine Suche nach den Namen durchführen und anschließend für jeden Namen ein eigenes Pattern generieren.
Zur Optimierung kannst du ja dann bereits durchlaufene Patterns über eine Liste ausschließen, sodass sie nicht erneut ausgeführt werden.
Beispiel für das 1. Pattern um die Namen herauszufinden:
PHP-Code:
$pattern = "!\{begin:(.*?)\}!si";
Das 2. solltest du anhand meiner Infos selbst zusammenbasteln können...
gruß
Piremilok
|

30-05-2010, 17:26
|
AmicaNoctis
 Moderatorin
|
|
Registriert seit: Jul 2009
Beiträge: 5.550
|
|
Hallo,
ein vielleicht etwas weit hergeholter, aber bei steigender Komplexität vielleicht nicht schlechter Vorschlag:
PHP-Code:
preg_replace("<\\{begin:(\\w+)\\}>", "<\\1>", $string); preg_replace("<\\{end:(\\w+)\\}>", "</\\1>", $string);
Danach kann man das Ganze per DOM verarbeiten und damit auch Helferlein wie XPath nutzen.
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! 
|

30-05-2010, 17:30
|
unset
 Moderator
|
|
Registriert seit: Jan 2007
Ort: Düsseldorf
Beiträge: 3.778
|
|
Wenn ich ehrlich bin, dachte ich mir direkt, dass es sinniger wäre, die Syntax leicht zu modifizieren, um dann entsprechend mit den Klassen dran zu gehen.
|

30-05-2010, 17:31
|
|
tr-oo-per
Registrierter Benutzer
|
|
Registriert seit: May 2010
Ort: at work
Beiträge: 32
|
|
Zitat:
Zitat von Piremilok
wenn du selbst die Namen nicht genau kennst, dann würde ich erstmal eine Suche nach den Namen durchführen und anschließend für jeden Namen ein eigenes Pattern generieren.
|
Danke für Deinen Vorschlag. So mache ich es im Moment auch, aber es wäre schön, wenn es dafür ein Suchmuster gibt, so dass ich alle Treffer mit einem preg_match_all-Aufruf bekomme. Beispielsweise:
Code:
$begin = "\\{begin:(.*)\\}";
$end = "\\{end:(.*)\\}";
$pattern = "/$begin(.*)$end/";
Jetzt ist meine Frage: kann ich $end umformulieren, um zu fordern, dass der Name der selbe ist, wie der innerhalb von $begin ermittelte?
@Amica: Thx, damit kann ich etwas anfangen!
Geändert von unset (30-05-2010 um 19:31 Uhr)
Grund: Doppelpost
|

30-05-2010, 19:16
|
 |
fireweasel
Registrierter Benutzer
|
|
Registriert seit: Sep 2008
Ort: At home
Beiträge: 680
|
|
Zitat:
Zitat von tr-oo-per
...
Code:
$begin = "\\{begin:(.*)\\}";
$end = "\\{end:(.*)\\}";
$pattern = "/$begin(.*)$end/";
Jetzt ist meine Frage: kann ich $end umformulieren, um zu fordern, dass der Name der selbe ist, wie der innerhalb von $begin ermittelte?
|
Sagt dir das Stichwort "back reference" etwas?
__________________
PHP-Code:
class Brick implements Throwable {
// ...
}
|

30-05-2010, 19:21
|
AmicaNoctis
 Moderatorin
|
|
Registriert seit: Jul 2009
Beiträge: 5.550
|
|
Du musst das lazy (also non-greedy) matchen, also „.*?“ statt „.*“.
__________________
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! 
|

30-05-2010, 19:44
|
|
tr-oo-per
Registrierter Benutzer
|
|
Registriert seit: May 2010
Ort: at work
Beiträge: 32
|
|
Kurz bevor der Hinweis kam, habe ich eine Backreference eingebaut. Jetzt stehe ich vor dem Problem, dass im Falle von Schachtelungen die inneren Sektionen nicht gefunden werden (im obigen Beispiel wäre das "section21").
Es macht derzeit keinen Unterschied ob ich greedy oder non-greedy matche, aber ich hab den Vorschlag an den betreffenden Stellen vorsichtshalber übernommen.
Code:
$begin = "\\{begin:(.*?)\\}";
$end = "\\{end:\\1\\}";
$pattern = "/" . $begin . ".*?" . $end . "/";
|

30-05-2010, 20:21
|
AmicaNoctis
 Moderatorin
|
|
Registriert seit: Jul 2009
Beiträge: 5.550
|
|
Zitat:
Zitat von tr-oo-per
Jetzt stehe ich vor dem Problem, dass im Falle von Schachtelungen die inneren Sektionen nicht gefunden werden
|
Dann ist vielleicht mein DOM-Hinweis doch was für dich?
__________________
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! 
|

30-05-2010, 20:52
|
|
tr-oo-per
Registrierter Benutzer
|
|
Registriert seit: May 2010
Ort: at work
Beiträge: 32
|
|
Zitat:
Zitat von AmicaNoctis
Dann ist vielleicht mein DOM-Hinweis doch was für dich?
|
Ich lass es noch auf ein paar Versuche mit dem Backreference-Ansatz ankommen. Wenn das nichts wird, werd ich auf Deinen Vorschlag zurückkommen, ganau
|

31-05-2010, 01:56
|
 |
fireweasel
Registrierter Benutzer
|
|
Registriert seit: Sep 2008
Ort: At home
Beiträge: 680
|
|
Zitat:
Zitat von tr-oo-per
Kurz bevor der Hinweis kam, habe ich eine Backreference eingebaut. Jetzt stehe ich vor dem Problem, dass im Falle von Schachtelungen die inneren Sektionen nicht gefunden werden (im obigen Beispiel wäre das "section21"). ...
|
Sagt dir das Stichwort "recursive subpatterns" etwas?
Das lesenswerte PHP-Handbuch hat eine ganze Seite dazu.
__________________
PHP-Code:
class Brick implements Throwable {
// ...
}
Geändert von fireweasel (31-05-2010 um 02:02 Uhr)
|

31-05-2010, 07:27
|
|
tr-oo-per
Registrierter Benutzer
|
|
Registriert seit: May 2010
Ort: at work
Beiträge: 32
|
|
Zitat:
Zitat von fireweasel
|
Hab gehofft dass es etwas derartiges gibt, aber nichts gefunden. Das bringt mich der Sache ein Stück näher, danke!
|
|
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
|
|
|
| Themen-Optionen |
|
|
| 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.
HTML-Code ist aus.
|
|
|
|
PHP News
|