2016-04-14 16 views
1

Ich versuche, den Base64-codierten Block mit einem Regex in PHP zu entsprechen. Es ist 'Content-Transfer-Encoding: base64' vorangestellt, also hatte ich gehofft, dass ich den Inhalt danach nur zusammenpassen konnte, aber meine Regex unten funktioniert nicht. Bitte helfen Sie mir diese Regex zu beheben, um den Base64-Block zu entsprechen. Der Base64-Block wird zweimal in einem E-Mail-Text wiederholt, ich nehme an, der erste Block ist die Textversion und der zweite HTML-Code. Ich würde gerne beide Basis-64-Blöcke anpassen, weshalb ich Preg-Match alle, aber nicht dieses mittlere Bit des Textes verwenden.Regex Base64-Block mit PHP preg_match_all

Dies ist der Code, den ich

bisher haben
$regex = '/Content-Transfer-Encoding:\sbase64\s\n(.*?)/'; 

preg_match_all($regex, $message, $matches); 

Dies ist die Botschaft:

Content-Transfer-Encoding: base64 

DQoNCg0KDQoNCg0KDQoNCg0KDQpbQiZRXTxodHRwOi8vd3d3LmRpeS5jb20+DQoNCg0KDQoNCg0K 
W2h0dHA6Ly9raW5nZmlzaGVyLnNjZW5lNy5jb20vaXMvaW1hZ2UvS2luZ2Zpc2hlci9pY29uX3N0 
b3JlX2xvY2F0b3I/d2lkPTM2JmhlaT0zNiZxbHQ9MTAwXTxodHRwOi8vd3d3LmRpeS5jb20vZmlu 
ZC1hLXN0b3JlPg0KDQoNCg0KRmluZCBhIHN0b3JlPGh0dHA6Ly93d3cuZGl5LmNvbS9maW5kLWEt 
c3RvcmU+DQoNCg0KDQoNCkN1c3RvbWVyIFNlcnZpY2VzDQoNCjAzMzMgMDE0IDMzNTcNCg0KDQoN 
Cg0KDQoNCg0KDQoNCkluc3BpcmF0aW9uPGh0dHA6Ly93d3cuZGl5LmNvbS9pbnNwaXJhdGlvbi8w 
Lmlyb290Pg0KDQpQcm9qZWN0czxodHRwOi8vd3d3LmRpeS5jb20vcHJvamVjdHMvMi5wcm9vdD4N 
Cg0KU2hvcDxodHRwOi8vd3d3LmRpeS5jb20vc2hvcC8+DQoNCkhlbHAgJiBBZHZpY2U8aHR0cDov 
L3d3dy5kaXkuY29tL2hlbHAtYWR2aWNlLzEuaHJvb3Q+DQoNCk15IGFjY291bnQ8aHR0cDovL3d3 
dy5kaXkuY29tL2N1c3RvbWVyL215X2FjY291bnQvPg0KDQoNCg0KDQoNCg0KDQoNCg0KRGVhciBC 
ZW4gUGF0b24NCg0KDQoNCg0KVGhhbmsgeW91IGZvciB5b3VyIG9yZGVyDQoNCg0KDQoNCg0KT3Jk 
ZXIgbnVtYmVyOg0KDQowMDYzMTA5MDU1DQoNCg0KDQpUb3RhbCBDb3N0Og0KDQrCozMuMjcNCg0K 
DQoNClRoYW5rIHlvdSBmb3Igb3JkZXJpbmcgZnJvbSBCJlEuIFlvdeKAmWxsIGZpbmQgZGV0YWls 
cyBvZiB5b3VyIG9yZGVyIGFuZCBkZWxpdmVyeSBvciBjb2xsZWN0aW9uIGluZm9ybWF0aW9uIGJl 
bG93LiBGb3IgaGVscCB3aXRoIHF1ZXN0aW9ucyBhYm91dCBvdXIgc2VydmljZSwgcGxlYXNlIHNl 

--_000_D16F6E4A2986D34F9D752E3564EAC46F51043449APP1198ghakfplc_ 
Content-Type: text/html; charset="utf-8" 
Content-Transfer-Encoding: base64 

PGh0bWwgeG1sbnM6dj0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTp2bWwiIHhtbG5zOm89InVy 
bjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOm9mZmljZSIgeG1sbnM6dz0idXJuOnNjaGVt 
YXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6d29yZCIgeG1sbnM6bT0iaHR0cDovL3NjaGVtYXMubWlj 
cm9zb2Z0LmNvbS9vZmZpY2UvMjAwNC8xMi9vbW1sIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcv 
+0

Verwendung '*' statt '. *?' und 's' Flag für die Übereinstimmung' .' mit neuer Zeile wie: - https://regex101.com/r/eM4hB3/1 – rock321987

+1

Hören Sie @ Rock321987, aber vorher fügen Sie weitere Details, was ist der ganze Zusammenhang? –

Antwort

1

Dies sollte funktionieren

/Content-Transfer-Encoding:\sbase64\s+(.*)(?=Content-Transfer-Encoding: base64|$)/g 

Regex Demo

PHP

$re = "/Content-Transfer-Encoding:\\sbase64\\s+(.*)(?=Content-Transfer-Encoding: base64|$)/"; 
$str = "Content-Transfer-Encoding: base64\n\nDQoNCg0KDQoNCg0KDQoNCg0KDQpbQiZRXTxodHRwOi8vd3d3LmRpeS5jb20+DQoNCg0KDQoNCg0K W2h0dHA6Ly9raW5nZmlzaGVyLnNjZW5lNy5jb20vaXMvaW1hZ2UvS2luZ2Zpc2hlci9pY29uX3N0 b3JlX2xvY2F0b3I/d2lkPTM2JmhlaT0zNiZxbHQ9MTAwXTxodHRwOi8vd3d3LmRpeS5jb20vZmlu ZC1hLXN0b3JlPg0KDQoNCg0KRmluZCBhIHN0b3JlPGh0dHA6Ly93d3cuZGl5LmNvbS9maW5kLWEt c3RvcmU+DQoNCg0KDQoNCkN1c3RvbWVyIFNlcnZpY2VzDQoNCjAzMzMgMDE0IDMzNTcNCg0KDQoN Cg0KDQoNCg0KDQoNCkluc3BpcmF0aW9uPGh0dHA6Ly93d3cuZGl5LmNvbS9pbnNwaXJhdGlvbi8w Lmlyb290Pg0KDQpQcm9qZWN0czxodHRwOi8vd3d3LmRpeS5jb20vcHJvamVjdHMvMi5wcm9vdD4N Cg0KU2hvcDxodHRwOi8vd3d3LmRpeS5jb20vc2hvcC8+DQoNCkhlbHAgJiBBZHZpY2U8aHR0cDov L3d3dy5kaXkuY29tL2hlbHAtYWR2aWNlLzEuaHJvb3Q+DQoNCk15IGFjY291bnQ8aHR0cDovL3d3 dy5kaXkuY29tL2N1c3RvbWVyL215X2FjY291bnQvPg0KDQoNCg0KDQoNCg0KDQoNCg0KRGVhciBC ZW4gUGF0b24NCg0KDQoNCg0KVGhhbmsgeW91IGZvciB5b3VyIG9yZGVyDQoNCg0KDQoNCg0KT3Jk ZXIgbnVtYmVyOg0KDQowMDYzMTA5MDU1DQoNCg0KDQpUb3RhbCBDb3N0Og0KDQrCozMuMjcNCg0K DQoNClRoYW5rIHlvdSBmb3Igb3JkZXJpbmcgZnJvbSBCJlEuIFlvdeKAmWxsIGZpbmQgZGV0YWls cyBvZiB5b3VyIG9yZGVyIGFuZCBkZWxpdmVyeSBvciBjb2xsZWN0aW9uIGluZm9ybWF0aW9uIGJl bG93LiBGb3IgaGVscCB3aXRoIHF1ZXN0aW9ucyBhYm91dCBvdXIgc2VydmljZSwgcGxlYXNlIHNl--_000_D16F6E4A2986D34F9D752E3564EAC46F51043449APP1198ghakfplc_ Content-Type: text/html; charset=\"utf-8\" Content-Transfer-Encoding: base64\n\nPGh0bWwgeG1sbnM6dj0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTp2bWwiIHhtbG5zOm89InVy bjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOm9mZmljZSIgeG1sbnM6dz0idXJuOnNjaGVt YXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6d29yZCIgeG1sbnM6bT0iaHR0cDovL3NjaGVtYXMubWlj cm9zb2Z0LmNvbS9vZmZpY2UvMjAwNC8xMi9vbW1sIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcv\n"; 

preg_match_all($re, $str, $matches); 

print_r($matches[1]); 

Ideone Demo

$matches ist ein Array von Arrays.

$matches[0] enthält alle übereinstimmenden Werte einschließlich Content-Transfer-Encoding:\\sbase64\\s+.

$matches[1] enthält alle nach Content-Transfer-Encoding:\\sbase64\\s+

+0

alles, was er tun muss, ist das Entfernen der?. das ist es. – sweaver2112

+0

@ sweaver2112 wait..actually gibt es 's' Modifizierer, um' .' zu newline – rock321987

+1

das Entfernen der? allein würde funktionieren, weil die Sequenz \ s \ n BEIDE der Zeilenumbrüche dort entspricht. (\ s stimmt mit Newline überein!) - aber das ist nicht wahrscheinlich, was passieren sollte oder sehr offensichtlich ist. Ihre Antwort ist in Ordnung. + 1 – sweaver2112

0

Ausgleichswerte, die Sie interessieren:

preg_match_all('/Content-Transfer-Encoding: base64\s+(.*?)$/', $subject, $result, PREG_PATTERN_ORDER); 
$baseString = $result[1][0]; 

REGEX ERKLÄRUNG:

Content-Transfer-Encoding: base64\s+(.*?)$ 


REGEX DEMO:

https://regex101.com/r/lI8lJ6/1


LIVE-PHP DEMO:

http://ideone.com/fK3z3n


UPDATE:

Basierend auf Ihre Kommentare, können Sie diese Regex verwenden, um eine Base64 Zeichenfolge zu erfassen und zu validieren:

^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$ 

SRC. https://stackoverflow.com/a/475217/797495

+0

Tut mir leid, ich habe die Frage bearbeitet, um mehr Kontext hinzuzufügen, wie die Base64 zweimal wiederholt. –

+0

Welche base64 brauchst du? der 1. oder 2.? Die 2. scheint keine gültige Base64-Zeichenfolge zu sein. –

+0

Ich muss beide erfassen und dann nach dem Base64-Teil auf beiden aufhören und ich brauche es in PHP zu arbeiten. Das 2. ist wahrscheinlich nicht gültig, da es ein kleiner Teil davon ist. Ich möchte die ganze Sache nicht hinter mir lassen, da sie sehr lang ist und Informationen enthält, die ich hier nicht teilen sollte. –