Hallo zusammen,
ich versuche mit PHP eine Textdatei nach bestimmten Vorkommen zu durchsuchen.
Die Suche geht immer über mehrere Zeilen.
Gesucht wird alle Vorkommen wo das wort "*OpenUI" am Zeilenanfang vorkommt. Danach kommt ein (oder mehrere) Leerzeichen gefolgt von * und dem Elementnamen.
Den Elementnamen habe ich.
Im Beispiel wird also alles gesucht das zwischen *OpenUI *PageSize: und
*CloseUI: *PageSize steht. Danach kommt eine Leerzeile und es folgt eine neue Zeile mit *OpenUI.
*OpenUI *PageSize: PickOne
*OrderDependency: 16.0 DocumentSetup *PageSize
*DefaultPageSize: Letter
*PageSize Letter/Letter: "(PageSize)(Letter)KDDHVDct/KFSet get exec countdictstack [{[612 792] KDDHVDct/_PGSize get exec} KDDHVDct/KFC get exec"
*PageSize Legal/Legal: "(PageSize)(Legal)KDDHVDct/KFSet get exec countdictstack [{[612 1008] KDDHVDct/_PGSize get exec} KDDHVDct/KFC get exec"
*PageSize Tabloid/Tabloid: "(PageSize)(Tabloid)KDDHVDct/KFSet get exec countdictstack [{[792 1224] KDDHVDct/_PGSize get exec} KDDHVDct/KFC get exec"
*PageSize A4/A4: "(PageSize)(A4)KDDHVDct/KFSet get exec countdictstack [{[595 842] KDDHVDct/_PGSize get exec} KDDHVDct/KFC get exec"
*CloseUI: *PageSize
*OpenUI *PageRegion: PickOne
...
Ich habe es so versucht.
if (preg_match_all("#\*OpenUI[^ ]* \*" .$element. "(/(.*?):|:)(.*?)\*CloseUI[^ ]*: \*" .$element. "#s", $teile[1], $contents)){
Das funktionierte bisher ganz gut. Nun habe ich aber eine Testdatei bekommen in der *OpenUI nicht am Zeilenanfang steht und es als Kommentar mitten im Text steht.
z.b.
*% default charge numbers by following the steps below.
*% 1. Locate the line beginning with "*% *OpenUI *NIS63ChargeNumber".
*% 2. Remove the *% symbols and the following space from this line and all of the
*% lines, down to and including the line beginning with "*% *CloseUI:".
*% Your default charge numbers are now None and 123456789.
*% 3. Save the edited file.
Das heisst meine Suche findet auch;
*OpenUI *NIS63ChargeNumber".
*% 2. Remove the *% symbols and the following space from this line and all of the
*% lines, down to and including the line beginning with "*% *CloseUI:
Ich hatte folgendes versucht:
1. Mit ^ ganz am Anfang #^\*OpenUI
2, Dann hatte ich versucht ganz am Ende ein Zeilenende mitzugeben
"\r\n#s"
Das alles brachte nichts. Was micht wundert ist auch die Tatsache das nur bis zum nächsten *CloseUI gesucht wird und nicht wie gedacht *CloseUI: *NIS66OpMsg
--------------------------------
*% *OpenUI *NIS66OpMsg/Operator Message: PickOne
*% *DefaultNIS66OpMsg: None
*% *OrderDependency: 56.0 DocumentSetup *NIS66OpMsg
*% *NIS66OpMsg None/None: "
*% (OpMsg)(***No Operator Message***)KDDHVDct/KFSet get exec
*% countdictstack [{}KDDHVDct/KFC get exec"
*% *End
*% *NIS66OpMsg OpMsg1/Message: "
*% (OpMsg)(Message)KDDHVDct/KFSet get exec
*% countdictstack [{(Message)KDDHVDct/KDOpMsg get exec}KDDHVDct/KFC get exec"
*% *End
*% *CloseUI: *NIS66OpMsg
------------------------------------
ein print_r($content) bringt unter anderem:
---------------
Array ( [0] => Array ( [0] => *OpenUI *NIS66OpMsg/Operator Message: PickOne *% *DefaultNIS66OpMsg: None *% *OrderDependency: 56.0 DocumentSetup *NIS66OpMsg *% *NIS66OpMsg None/None: " *% (OpMsg)(***No Operator Message***)KDDHVDct/KFSet get exec *% countdictstack [{}KDDHVDct/KFC get exec" *% *End *% *NIS66OpMsg OpMsg1/Message: " *% (OpMsg)(Message)KDDHVDct/KFSet get exec *% countdictstack [{(Message)KDDHVDct/KDOpMsg get exec}KDDHVDct/KFC get exec" *% *End *% *CloseUI: *NIS66OpMsg ) [1] => Array ( [0] => /Operator Message: ) [2] => Array ( [0] => Operator Message ) [3] => Array ( [0] => PickOne *% *DefaultNIS66OpMsg: None *% *OrderDependency: 56.0 DocumentSetup *NIS66OpMsg *% *NIS66OpMsg None/None: " *% (OpMsg)(***No Operator Message***)KDDHVDct/KFSet get exec *% countdictstack [{}KDDHVDct/KFC get exec" *% *End *% *NIS66OpMsg OpMsg1/Message: " *% (OpMsg)(Message)KDDHVDct/KFSet get exec *% countdictstack [{(Message)KDDHVDct/KDOpMsg get exec}KDDHVDct/KFC get exec" *% *End *% ) )
-----------------
Puuuhhh, ich glaube ich kapier die RegEx nie ;-(
vielen Dank und viele Grüße
hawk