1

私はこのような変数を持っています:

$mail_from = "Firstname Lastname <email@domain.com>";

どちらかを受け取りたい

array(name=>"firstname lastname", email=>"email@domain.com")
or 
the values in two separate vars ($name = "...", $email = "...")

私はpreg_replaceで遊んでいますが、どういうわけかそれを成し遂げません...

広範囲にわたる検索を行いましたが、これを実行する方法が見つかりませんでした。

これは私が得た最も近いものです:

$str = 'My First Name <email@domain.com>';
preg_match('~(?:"([^"]*)")?\s*(.*)~',$str,$var);
print_r($var);
echo "<br>Name: ".$var[0];
echo "<br>Mail: ".$var[2];

「email@domain.com」を$var['x]に入れるにはどうすればよいですか?

ありがとうございました。

4

3 に答える 3

2

これはあなたの例で機能し、電子メールが山括弧内にある場合は常に機能するはずです。

$str = 'My First Name <email@domain.com>';
preg_match('~(?:([^<]*?)\s*)?<(.*)>~', $str, $var);
print_r($var);
echo "<br>Name: ".$var[1];
echo "<br>Mail: ".$var[2];

説明:

(?:([^<]*?)\s*)?オプションで、ではないすべてに一致し<、末尾の空白を除くすべてがグループ1に格納されます。

<(.*)>山かっこで囲まれたものと一致し、グループ2に格納します。

于 2012-05-02T11:08:17.160 に答える
0
 //trythis
 $mail_from = "Firstname Lastname <email@domain.com>";
 $a = explode("<", $mail_from);
 $b=str_replace(">","",$a[1]);
 $c=$a[0];
 echo $b;
 echo $c;
于 2012-05-02T10:49:38.297 に答える
0

これを試して:

(?<=")([^"<>]+?) *<([^<>"]+)>(?=")

説明:

<!--
(?<=")([^"<>]+?) *<([^<>"]+)>(?=")

Options: ^ and $ match at line breaks

Assert that the regex below can be matched, with the match ending at this position (positive lookbehind) «(?<=")»
   Match the character “"” literally «"»
Match the regular expression below and capture its match into backreference number 1 «([^"<>]+?)»
   Match a single character NOT present in the list “"<>” «[^"<>]+?»
      Between one and unlimited times, as few times as possible, expanding as needed (lazy) «+?»
Match the character “ ” literally « *»
   Between zero and unlimited times, as many times as possible, giving back as needed (greedy) «*»
Match the character “&lt;” literally «<»
Match the regular expression below and capture its match into backreference number 2 «([^<>"]+)»
   Match a single character NOT present in the list “&lt;>"” «[^<>"]+»
      Between one and unlimited times, as many times as possible, giving back as needed (greedy) «+»
Match the character “&gt;” literally «>»
Assert that the regex below can be matched, starting at this position (positive lookahead) «(?=")»
   Match the character “"” literally «"»
-->

コード:

$result = preg_replace('/(?<=")([^"<>]+?) *<([^<>"]+)>(?=")/m', '<br>Name:$1<br>Mail:$2', $subject);

于 2012-05-02T10:49:55.597 に答える