【问题标题】:Split string between less and greater than在小于和大于之间拆分字符串
【发布时间】:2012-07-19 10:14:53
【问题描述】:

我需要拆分这种字符串来分隔小于和大于 之间的电子邮件。我正在尝试下一个regexpreg_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);
}

【问题讨论】:

  • 你想要什么输出?看起来拆分正在起作用。
  • 我想要的输出是我在之后输入的结果:。现在,拆分不起作用,因为我没有得到任何拆分。我总是有与原来相同的字符串。这就是我想要得到的

标签: php regex pcre


【解决方案1】:

您可以使用一些可用于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
)

【讨论】:

  • $pattern 要使用什么?
  • 与您已有的相同。为了清晰起见,我将编辑答案。
  • 不工作...我总是得到原始字符串,例如array(1) { [0]=&gt; string(57) ""email1@domain.com" &lt;email1@domain.com&gt;" }
  • 对我来说效果很好。您是否“按原样”使用代码?尝试复制和粘贴,以确保安全。
  • 你是对的,这是有效的。但不是骗我的阵列。我会尝试猜测原因,我想这将是一件愚蠢的事情。谢谢你;)
【解决方案2】:

拆分某些内容会删除分隔符(即正则表达式匹配的所有内容)。你可能想分开

\s*<|>

相反。或者您可以将preg_match 与正则表达式一起使用

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

并使用第一个和第二个捕获组。

【讨论】:

  • 第二个选项我得到preg_match(): Unknown modifier '&gt;',第一个选项得到preg_split(): Delimiter must not be alphanumeric or backslash
  • 我给了你一个正则表达式,你需要添加分隔符才能将它们与 PHP 中的 PCRE 函数一起使用。并且可能会根据您使用的字符串来逃避事情。所以它应该是'/^(.*?)\s*&lt;([^&gt;]+)&gt;/' 在那里使用。
【解决方案3】:

这将完成这项工作。 click here for Codepad link

$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);

【讨论】:

    【解决方案4】:
    preg_match_all("/<(.*?)>/", $string, $result_array);
    print_r($result_array);
    

    【讨论】:

      【解决方案5】:
      $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 ) ) 
      

      【讨论】:

        【解决方案6】:

        也可以用"

          $pattern = '/</';
          $result = preg_split($pattern, $email);
          $result = preg_replace("/>/", "", $result);
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多