2

この種の文字列を分割して、電子メールを< >より小さいものとより大きいものに分ける必要があります。regex次のとを試していpreg_splitますが、うまくいきません。

"email1@domain.com" <email1@domain.com>
News <news@e.domain.com>
Some Stuff <email-noreply@somestuff.com>

期待される結果は次のようになります。

Array
(
    [0] => "email1@domain.com"
    [1] => email@email.com
)
Array
(
    [0] => News
    [1] => news@e.domain.com
)
Array
(
    [0] => Some Stuff
    [1] => email-noreply@somestuff.com
)

私が現在使用しているコード:

foreach ($emails as $email)
{
   $pattern = '/<(.*?)>/';
   $result = preg_split($pattern, $email);
   print_r($result);
}
4

6 に答える 6

2

何かで分割すると、区切り文字が削除されます (つまり、正規表現が一致するすべてのもの)。あなたはおそらく分割したい

\s*<|>

代わりは。preg_matchまたは、正規表現で使用できます

^(.*?)\s*<([^>]+)>

1 番目と 2 番目のキャプチャ グループを使用します。

于 2012-07-19T10:20:40.770 に答える
2

preg_split:PREG_SPLIT_DELIM_CAPTURE および PREG_SPLIT_NO_EMPTY. _

$emails = array('"email1@domain.com" <email1@domain.com>', 'News <news@e.domain.com>', 'Some Stuff <email-noreply@somestuff.com>');

foreach ($emails as $email)
{
    $pattern = '/<(.*?)>/';
    $result = preg_split($pattern, $email, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);
    print_r($result);
}

これはあなたが期待するものを出力します:

Array
(
    [0] => "email1@domain.com" 
    [1] => email1@domain.com
)
Array
(
    [0] => News 
    [1] => news@e.domain.com
)
Array
(
    [0] => Some Stuff 
    [1] => email-noreply@somestuff.com
)
于 2012-07-19T10:26:03.757 に答える
1

これは仕事をします。コードパッドのリンクはこちら

$header = '"email1@domain.com" <email1@domain.com>
News <news@e.domain.com>
Some Stuff <email-noreply@somestuff.com>';

$result = array();
preg_match_all('!(.*?)\s+<\s*(.*?)\s*>!', $header, $result);

$formatted = array();
for ($i=0; $i<count($result[0]); $i++) {
  $formatted[] = array(
    'name' => $result[1][$i],
    'email' => $result[2][$i],
  );
}
print_r($formatted);
于 2012-07-19T10:41:08.047 に答える
0
preg_match_all("/<(.*?)>/", $string, $result_array);
print_r($result_array);
于 2012-07-19T10:25:57.350 に答える
0
$email='"email1@domain.com" <email1@domain.com>
News <news@e.domain.com>
Some Stuff <email-noreply@somestuff.com>';
$pattern = '![^\>\<]+!';
preg_match_all($pattern, $email,$match);
print_r($match);

出力:

Array ( [0] => Array ( 
[0] => "email1@domain.com" 
[1] => email1@domain.com 
[2] => News 
[3] => news@e.domain.com 
[4] => Some Stuff 
[5] => email-noreply@somestuff.com ) ) 
于 2012-07-19T10:26:26.123 に答える
0

< で分割し、$result で ">" を取り除くこともできます

  $pattern = '/</';
  $result = preg_split($pattern, $email);
  $result = preg_replace("/>/", "", $result);
于 2012-07-19T10:26:55.417 に答える