2016-07-21 14 views
1

PCRE MitRegex Suche nach vorne zu schauen

Text:

<xsi:placeOrderResult list="test:value">1469120938131</placeOrderResult></soapenv:Body> 

Möchten alle alphanumerischen Zeichen entsprechen folgenden (aber nicht einschließlich) der „<“ Charakter, bis zu und einschließlich der " : "Charakter, aber der Doppelpunkt muss gefunden werden, bevor das FIRST"> "gefunden wird.

erwartetes Ergebnis für oben wäre:

<placeOrderResult list="test:value">1469120938131</placeOrderResult></soapenv:Body> 

Der erste Teil ist ziemlich einfach - was ich kann nicht herausfinden, ist der „Doppelpunkt vor dem ersten gefunden werden muss>“.

+1

Können Sie uns zeigen, was Sie bereits versucht haben? – IcyIcicle

+0

Sicher, das ist so nah wie ich bekommen konnte: (? <= <) \ W + ?: Es stimmt zwar überein, was ich entfernen möchte, aber es überprüft nicht, ob das: vor einer schließenden Klammer aufgetreten ist. Ich denke, diese Regex wird in Ordnung sein, weil ich in der Anwendung, die ich verwende, die Option AUSWÄHLEN nur die übereinstimmende Zeichenfolge oder Entfernen nur die übereinstimmende Zeichenfolge, so kann ich einfach die Entfernen-Funktion verwenden und damit fertig sein. – user3213146

Antwort

0
(?<=<)(\w+?:)(?=[^<]*?>) 

https://regex101.com/r/yY7yD7

$re = "/(?<=<)(\\w+?:)(?=[^<]*?>)/"; 
$str = "#Text:\n<xsi:placeOrderResult list=\"test:value\">1469120938131</placeOrderResult></soapenv:Body>\n\n#Expected result\n<placeOrderResult list=\"test:value\">1469120938131</placeOrderResult></soapenv:Body>"; 
$subst = ""; 

$result = preg_replace($re, $subst, $str, 1); 

Regex Erklärt:

  • (?<=<) - Positive Lookbehind - Spiele den Charakter <.

  • \w+? Spiel jeden Wort Zeichen [a-zA-Z0-9_] zwischen einem und unbegrenzten Zeiten, so wenig wie möglich, je nach Bedarf erweitert [faul]

  • : entspricht das Zeichen : buchstäblich
  • (?=[^<]*?>) Positive Lookahead - Entspricht jedem Zeichen nicht < zwischen ein und unbegrenzte Male, so oft wie möglich, erweitert nach Bedarf [faul]. bis es das Zeichen > erreicht.

Wenn Sie nichts subtitute, „“, für die aufgenommene regex, es gibt Ihr erwartetes Ergebnis:

<placeOrderResult list="test:value">1469120938131</placeOrderResult></soapenv:Body> 
+0

Danke für die Antwort. Diese Regex wählt jedoch den gesamten Text in meinem Beispiel - all dies: 1469120938131 user3213146

+0

Obwohl mein Beispiel sowohl auf php als auch auf regex101 funktioniert hat, Ich habe es so aktualisiert, dass es das enthält, was Sie wollten, um sicherzustellen, dass das: vor einer schließenden Klammer aufgetreten ist. Wenn Sie denken, dass dies nicht funktioniert, verwenden Sie bitte den Link regex101 und zeigen Sie mir ein Beispiel, wie es nicht funktioniert. –