@@ -42,31 +42,44 @@ abstract class AbstractAddressList implements HeaderInterface
42
42
public static function fromString ($ headerLine )
43
43
{
44
44
list ($ fieldName , $ fieldValue ) = GenericHeader::splitHeaderLine ($ headerLine );
45
- $ decodedValue = HeaderWrap::mimeDecodeValue ($ fieldValue );
46
- $ wasEncoded = ($ decodedValue !== $ fieldValue );
47
- $ fieldValue = $ decodedValue ;
48
-
49
45
if (strtolower ($ fieldName ) !== static ::$ type ) {
50
46
throw new Exception \InvalidArgumentException (sprintf (
51
- 'Invalid header line for "%s" string ' ,
52
- __CLASS__
53
- ));
54
- }
55
- $ header = new static ();
56
- if ($ wasEncoded ) {
57
- $ header ->setEncoding ('UTF-8 ' );
47
+ 'Invalid header line for "%s" string ' ,
48
+ __CLASS__
49
+ ));
58
50
}
51
+
59
52
// split value on ","
60
53
$ fieldValue = str_replace (Headers::FOLDING , ' ' , $ fieldValue );
61
54
$ fieldValue = preg_replace ('/[^:]+:([^;]*);/ ' , '$1, ' , $ fieldValue );
62
- $ values = str_getcsv ($ fieldValue , ', ' );
55
+ $ values = str_getcsv ($ fieldValue , ', ' );
56
+
57
+ $ wasEncoded = false ;
63
58
array_walk (
64
59
$ values ,
65
- function (&$ value ) {
66
- $ value = trim ($ value );
60
+ function (&$ value ) use (&$ wasEncoded ) {
61
+ $ decodedValue = HeaderWrap::mimeDecodeValue ($ value );
62
+ $ wasEncoded = $ wasEncoded || ($ decodedValue !== $ value );
63
+ $ value = trim ($ decodedValue );
67
64
$ value = self ::stripComments ($ value );
65
+ $ value = preg_replace (
66
+ [
67
+ '#(?<! \\\)"(.*)(?<! \\\)"# ' , //quoted-text
68
+ '# \\\([\x01-\x09\x0b\x0c\x0e-\x7f])# ' //quoted-pair
69
+ ],
70
+ [
71
+ '\\1 ' ,
72
+ '\\1 '
73
+ ],
74
+ $ value
75
+ );
68
76
}
69
77
);
78
+ $ header = new static ();
79
+ if ($ wasEncoded ) {
80
+ $ header ->setEncoding ('UTF-8 ' );
81
+ }
82
+
70
83
$ values = array_filter ($ values );
71
84
72
85
$ addressList = $ header ->getAddressList ();
0 commit comments