2016-04-14 7 views
3

Ich möchte vom Ende eines Ergebnisses aus einer oder Bedingung in regulären Ausdruck übereinstimmen.Regulärer Ausdruck, der vom Ende einer Übereinstimmungsbedingung abgleicht

$a = 'SI-#CL#¤1801 BARBER LANE#CL#MILPITAS CA 95035#CL#FONE 1-408-943-0600#CL#FAX 1-408-943-0484#CL#¤CANCEL BY 5 PM - RQST-NO FEATHER'; 
$pat = '/^(?(?=SI)(?<matchfromend>[A-Z]+$)|(?<else>.*))/'; 

ich will BY 05.00 ABBRECHEN entsprechen - RQST-NO FEDER nur, wenn der String beginnt SI-

Jeder Vorschlag ??

Dank

+0

Was Sie versuchen zu passen genau sind? – npinti

+0

Ich möchte ABBRUCH BY 5 PM - RQST-NO FEATHER nur wenn String beginnt von SI- –

+0

Eine andere Idee mit bedingten: ['^ (? (? = SI -). * # ¤) \ K. +'] (https://regex101.com/r/pR7rN6/3) oder [eins ohne] (https://regex101.com/r/pR7rN6/1). –

Antwort

1

Ihr (?(?=SI)(?<matchfromend>[A-Z]+$) regex Teil verbraucht keine willkürlichen Zeichen vom Anfang des Strings bis (?<matchfromend>[A-Z]+$ Muster bis zum Ende.

können Sie die folgende regex verwenden:

'~^(?(?=SI).*#¤(?<matchfromend>.+$)$|(?<else>.*))~' 

Siehe regex demo

Erklärung:

  • ^ - Beginn der Zeichenfolge
  • (?(?=SI).*#¤(?<matchfromend>.+$)$|(?<else>.*)) - ein bedingtes:
    • Wenn SI zu Beginn erscheint ((?=SI)) Spiel 0+ andere Zeichen als eine neue Zeile zum letzten auf und erfassen 1+ anderen Zeichen als eine neue Zeile an das Ende der Zeichenfolge in Gruppen up „matchfromend“
    • Wenn am Anfang kein SI vorhanden ist, passen Sie 0+ Zeichen außer einem Zeilenumbruch bis zum Ende der Zeile an.

Ein weiteres nicht-REGEX Ansatz

prüfen, ob ein String mit SI beginnt und wenn ja, explodieren mit und das letzte Element erhalten. Wenn nicht, benutze die ganze Zeichenfolge.

Siehe IDEONE demo:

$str = "SI-#CL#¤1801 BARBER LANE#CL#MILPITAS CA 95035#CL#FONE 1-408-943-0600#CL#FAX 1-408-943-0484#CL#¤CANCEL BY 5 PM - RQST-NO FEATHER"; // => CANCEL BY 5 PM - RQST-NO FEATHER 
//$str = "#CL#¤1801 BARBER LANE#CL#MILPITAS CA 95035#CL#FONE 1-408-943-0600#CL#FAX 1-408-943-0484#CL#¤CANCEL BY 5 PM - RQST-NO FEATHER"; 
$res = $str; 
if (strrpos($str, "SI", -strlen($str)) !== false) { // starts with SI 
    $arr = explode("#¤", $str); 
    if (!empty($arr)){ 
     $res = array_pop($arr); 
    } 
} 
echo $res; 
+0

Ich denke, eine Bedingung ist genug, bitte überprüfen (keine Notwendigkeit, in einem Lookahead zu erfassen). –