【问题标题】:split string of emails into groups if string is longer than 50 emails如果字符串长于 50 封电子邮件,则将电子邮件字符串拆分为组
【发布时间】:2011-08-25 21:21:01
【问题描述】:

有没有一种有效的方法将包含电子邮件地址列表的字符串拆分为 50 个组。假设我有一个包含逗号分隔格式的电子邮件的字符串。像... email1@host.com,email2@host.com,email3@host.com 等等。

最明显的方法可能是数组,但是有没有办法用字符串函数来做呢?我看过 substr 和 str_split ,他们似乎没有退出。

谢谢

【问题讨论】:

    标签: php string email split comma


    【解决方案1】:

    搜索第 50 次出现的逗号并在此之后拆分字符串应该会更有效率。 所以找到这个职位。我认为这个http://www.php.net/manual/en/function.strpos.php#102336 应该是一个解决方案。 然后用 substr 分割字符串,去掉新字符串 pos 1 处的逗号。

    缩短 PHP 代码以满足您的需求:

    <?php 
    
    function strnpos( $haystack, $needle, $nth, $offset = 0 ) { 
        //  If needle is not a string, it is converted to an integer and applied as the ordinal value of a character. 
        if(!is_string($needle)) 
            $needle = chr((int)$needle ); 
    
        //  Are the supplied values valid / reasonable? 
        $len = strlen( $needle ); 
        if(1 > $nth || 0 === $len) 
            return false; 
    
        //  $offset is incremented in the call to strpos, so make sure that the first 
        //  call starts at the right position by initially decreasing $offset by $len. 
        $offset -= $len; 
        do { 
            $offset = strpos( $haystack, $needle, $offset + $len ); 
        } while( --$nth  && false !== $offset ); 
    
        return $offset;
    } 
    
    $emails_str = 'email1@host.com,email2@host.com,email3@host.com,...';
    
    $pos = strnpos($emails_str, ',', 50, 0);
    while($pos) {
        // Do sth. with the group...
        echo substr($emails_str, 0, $pos), PHP_EOL; 
    
        // Cut this part out of the string
        $emails_str = substr($emails_str, $pos+1);
        $pos = strnpos($emails_str, ',', 50, 0);
    }
    

    【讨论】:

      【解决方案2】:

      是的,找到

      $string="word_1, word_2, word_3"; 
      $array=preg_split("/([,]{49}[,])+",$string);
      

      或者你可以使用

      一套完整的 strn*pos 函数,用于在大海捞针中寻找第 n 次出现的针。我更喜欢 strnpos 的这种实现,因为它在提供长度为 0 的针时不会给出可见的警告(诚然,这是非标准行为)。基于版本 I [最初发布于 2010 年 3 月 5 日];这个新版本更符合 strpos 的语义。

      <?php 
      
      /** 
       *  This function implements all the strn*pos functions, which return the $nth occurrence of $needle 
       *  in $haystack, or false if it doesn't exist / when illegal parameters have been supplied. 
       * 
       *  @param  string  $haystack       the string to search in. 
       *  @param  MIXED   $needle         the string or the ASCII value of the character to search for. 
       *  @param  integer $nth            the number of the occurrence to look for. 
       *  @param  integer $offset         the position in $haystack to start looking for $needle. 
       *  @param  bool    $insensitive    should the function be case insensitive? 
       *  @param  bool    $reverse        should the function work its way backwards in the haystack? 
       *  @return MIXED   integer         either the position of the $nth occurrence of $needle in $haystack, 
       *               or boolean         false if it can't be found. 
       */ 
      function strnripos_generic( $haystack, $needle, $nth, $offset, $insensitive, $reverse ) 
      { 
          //  If needle is not a string, it is converted to an integer and applied as the ordinal value of a character. 
          if( ! is_string( $needle ) ) { 
              $needle = chr( (int) $needle ); 
          } 
      
          //  Are the supplied values valid / reasonable? 
          $len = strlen( $needle ); 
          if( 1 > $nth || 0 === $len ) { 
              return false; 
          } 
      
          if( $insensitive ) { 
              $haystack = strtolower( $haystack ); 
              $needle   = strtolower( $needle   ); 
          } 
      
          if( $reverse ) { 
              $haystack = strrev( $haystack ); 
              $needle   = strrev( $needle   ); 
          } 
      
          //  $offset is incremented in the call to strpos, so make sure that the first 
          //  call starts at the right position by initially decreasing $offset by $len. 
          $offset -= $len; 
          do 
          { 
              $offset = strpos( $haystack, $needle, $offset + $len ); 
          } while( --$nth  && false !== $offset ); 
      
          return false === $offset || ! $reverse ? $offset : strlen( $haystack ) - $offset; 
      } 
      
      /** 
       *  @see    strnripos_generic 
       */ 
      function strnpos( $haystack, $needle, $nth, $offset = 0 ) 
      { 
          return strnripos_generic( $haystack, $needle, $nth, $offset, false, false ); 
      } 
      
      /** 
       *  @see    strnripos_generic 
       */ 
      function strnipos( $haystack, $needle, $nth, $offset = 0 ) 
      { 
          return strnripos_generic( $haystack, $needle, $nth, $offset, true, false ); 
      } 
      
      /** 
       *  @see    strnripos_generic 
       */ 
      function strnrpos( $haystack, $needle, $nth, $offset = 0 ) 
      { 
          return strnripos_generic( $haystack, $needle, $nth, $offset, false, true ); 
      } 
      
      /** 
       *  @see    strnripos_generic 
       */ 
      function strnripos( $haystack, $needle, $nth, $offset = 0 ) 
      { 
          return strnripos_generic( $haystack, $needle, $nth, $offset, true, true ); 
      } 
      
      $haystack = 'Dit is een HoTtentotTentenTentenToonstellingTest!'; 
      
      echo strnpos  ( $haystack, 't', 5 ), ' === ', strnpos  ( $haystack, 116, 5 ), PHP_EOL; 
      echo strnipos ( $haystack, 't', 5 ), ' === ', strnipos ( $haystack, 116, 5 ), PHP_EOL; 
      echo strnrpos ( $haystack, 't', 5 ), ' === ', strnrpos ( $haystack, 116, 5 ), PHP_EOL; 
      echo strnripos( $haystack, 't', 5 ), ' === ', strnripos( $haystack, 116, 5 ), PHP_EOL; 
      echo PHP_EOL; 
      echo strnpos  ( $haystack, 'T', 5 ), ' === ', strnpos  ( $haystack,  84, 5 ), PHP_EOL; 
      echo strnipos ( $haystack, 'T', 5 ), ' === ', strnipos ( $haystack,  84, 5 ), PHP_EOL; 
      echo strnrpos ( $haystack, 'T', 5 ), ' === ', strnrpos ( $haystack,  84, 5 ), PHP_EOL; 
      echo strnripos( $haystack, 'T', 5 ), ' === ', strnripos( $haystack,  84, 5 ), PHP_EOL; 
      ?>
      

      【讨论】:

        【解决方案3】:
        $emails = 'email1@host.com,email2@host.com,email3@host.com,...';
        if( substr_count( $emails, '@' ) > 50 )
        {
            $groups = explode( ',', $emails );
            $groups = array_chunk( $groups, 50 );
        
            $emails = '';
            foreach( $groups as $k => $group )
            {
                $group_data = implode( ', ', $group );
                $emails .= "{$group_data}<hr/>";
            }
        }
        echo $emails;
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2017-12-11
          • 2021-07-25
          • 2021-05-31
          • 2013-02-04
          • 1970-01-01
          • 1970-01-01
          • 2015-04-18
          相关资源
          最近更新 更多