hawkmaster: Hilfe bei regulärem Ausdruck gesucht

Beitrag lesen

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