2016-11-13 9 views
2

Ich kam in dieser Codezeile:REGEX - ignorieren neue Zeile Zeichen

preg_match_all("!boundary=(.*)$!mi", $content, $matches); 

aber für

Content-Type: multipart/alternative; boundary = f403045e21e067188c05413187fd \ r \ n

Es gibt

f403045e21e067188c05413187fd \ r

Wenn es

f403045e21e067188c05413187fd

zurückkehren sollte

(ohne die \r)

Irgendwelche Ideen, wie Sie das beheben können?

PS .: Es sollte auch für arbeiten, wenn \r nicht vorhanden ist, nur \n

+0

Sind '\ 'und' \ n' Literale oder die neuen Zeilenzeichen? – chris85

Antwort

2

Es gibt zwei Möglichkeiten.

  1. Verwenden faul Punktanpassung und fügen Sie eine optionale \r:

    preg_match_all("!boundary=(.*?)\r?$!mi", $content, $matches);

Siehe this PHP demo

  1. Verwenden Sie ein [^\r\n] negierte Zeichen Klasse, die einem beliebigen Zeichen entspricht, aber \r und \n:

    preg_match_all("!boundary=([^\n\r]*)!mi", $content, $matches);

Oder eine kürzere Version, die \V Stenografie Zeichenklasse für ein beliebiges Zeichen verwenden, die keine vertikale Leerzeichen ist (kein Zeilenumbruch Zeichen):

preg_match_all("!boundary=(\V*)!mi", $content, $matches); 

See this oder this PHP demo.

Hinweis, dass der zweite Ansatz viel effizienter ist.

+2

Verwendung von '\ V' sollte auch für den zweiten Fall funktionieren. –

+1

Richtig, ich überprüfte immer noch Muster und hielt nur bei '\ N' an. '\ V' funktioniert auch. –

+0

erste funktionierte gut, versuchte nicht die zweite. Vielen Dank! –

0

Ändern Sie den Ausdruck zu

preg_match_all("!boundary=(.*)\\r?$!mi", $content, $matches); 

, dass die \ r Streifen sollten, falls vorhanden.

Bearbeitet: \ r muss in der RegExp entkommen.

+0

Diese Lösung [funktioniert nicht] (http://ideone.com/K70iQ4), da der Wagenrücklauf immer noch da ist. –

+0

hat nicht funktioniert, danke, obwohl –

Verwandte Themen