Suchmuster Optimierung ?
hawkmaster
- php
0 Hopsel0 hawkmaster0 hawkmaster0 Hopsel0 hawkmaster0 Hopsel
Hallo zusammen,
habe kein Problem.
Möchte nur mal von euch Experten wissen, ob man in folgendem Fall noch etwas anders machen kann.
in einem Text kommen folgende Zeilen vor:
*OpenUI *PageSize: PickOne
*OpenUI *XYPaperPolicy/Fit to Paper: PickOne
zum Anzeigen bzw. weiterverarbeiten brauche ich:
PageSize
XYPaperPolicy
Wenn ein Wort zwischen Schrägstrich / und : vorkommt also wie bei "/Fit to Paper:" brauche ich auch das Wort dazwischen, also;
Fit to Paper
ich mache das so:
if (preg_match_all("#\OpenUI \(.*?)(/(.*?))?:(.*?)\n#", $teile[1], $uielements)){
..
Mit Hilfe von (/(.*?))? möchte ich sagen das der Schrägstrich und ein Wort dahinter einmal vorkommen kann ODER nicht.
Soweit klappt es auch.
Blos wird mir in der Anzeige später immer der / mit ins Ergebnis aufgenommen.
Gibt es da eine Möglichkeit dies zu optimieren?
vielen Dank und viele Grüße
hawk
Hi hawkmaster!
if (preg_match_all("#\OpenUI \(.*?)(/(.*?))?:(.*?)\n#", $teile[1], $uielements)){
..
Blos wird mir in der Anzeige später immer der / mit ins Ergebnis aufgenommen.
Die Treffer werden in einem Array gespeichert. Dort müsste auch der Text ohne den Slash vorhanden sein.
Was soll eigentlich "*?"? Der Stern steht doch schon für "keins oder beliebig viele". Davon nochmal "kein- oder einmal" zu nehmen erscheint mir sinnfrei.
MfG H☼psel
Hallo Hopsel,
vielen Dank für deine Hilfe
Was soll eigentlich "*?"? Der Stern steht doch schon für "keins oder beliebig viele". Davon nochmal "kein- oder einmal" zu nehmen erscheint mir sinnfrei.
hmm, du meinst das hier?
(/(.*?))?
ich dachte (.*?) für ein oder mehrere beliebige Zeichen nach dem /.
und das ganze zusammen (/ )? darf einmal oder keinmal vorkommen.
Oder mache ich einen Denkfehler?
vielen Dank und viele Grüße
hawk
Hallo nochmals,
Die Treffer werden in einem Array gespeichert. Dort müsste auch der Text ohne den Slash vorhanden sein.
das mit dem Array ist klar,
if (preg_match_all("#\OpenUI \(.*?)(/(.*?))?:(.*?)\n#", $teile[1], $uielements)){
wenn ich aber z.b.
print_r($uielements[2]);
wird mir trotzdem immer der Slash / mit angezeigt.
/NameXY
/OptionXY
ich vermute das es am ? liegt, einmal oder keinmal.
Denn wenn ich es so mache
if (preg_match_all("#\OpenUI \(.*?)/(.*?):(.*?)\n#", $teile[1], $uielements)){
ist er im ergebnis weg. Aber dann werden halt nur die Zeilen gefunden wo wirklich nur /NameXY: vorkommt und z.b. nicht;
*OpenUI *PageSize: PickOne
vielen Dank und viele Grüße
hawk
Hi hawkmaster!
ich vermute das es am ? liegt, einmal oder keinmal.
Denn wenn ich es so mache
if (preg_match_all("#\OpenUI \(.*?)/(.*?):(.*?)\n#", $teile[1], $uielements)){
Wie wär´s denn mit if (preg_match_all("#\*OpenUI \*(.*)/?(.*):(.*)#", $teile[1], $uielements)){ // ...
MfG H☼psel
Hallo Hopsel,
Wie wär´s denn mit
if (preg_match_all("#\*OpenUI \*(.*)/?(.*):(.*)#", $teile[1], $uielements)){ // ...
leider auch nicht,
in diesem Fall wird mir dann
XYPaperPolicy/Fit to Paper
geliefert, also beides zusammen.
Na ich glaube fast ich muss zwei getrennte Regexe machen.
vielen Dank und viele Grüße
hawk
Hi hawkmaster!
in diesem Fall wird mir dann
XYPaperPolicy/Fit to Paper
geliefert, also beides zusammen.
Da der Slash als Trennelement dient kannst du auch eine Zeichenklasse verwenden, die auf alle Zeichen außer dem Slash passt: #\OpenUI \([^/]*)/?(.*):(.*)#
Oder du matchst prinzipiell erstmal auf #\OpenUI \([^:]*)# und "explodierst" dann anhand des "/". Dann hast du entweder ein oder zwei Element(e), also "XYPaperPolicy" und evtl. "Fit to Paper".
MfG H☼psel