【问题标题】:PHP find string within known charactersPHP在已知字符内查找字符串
【发布时间】:2012-08-17 13:03:19
【问题描述】:

请检查以下内容:

$email  = 'name@example.com';
$domain = strstr($email, '@');
echo $domain; // prints @example.com

有没有办法可以在没有 .com 的情况下返回 @example?

所以,基本上我需要在字符串中搜索一组我不知道的字符,这些字符存在于一组我知道的字符之间。

所以,在下面我想返回“狗”:

$string = "我曾经养过一只名叫spot的宠物狗";

我可以使用以下方法获取字符串的最后一部分:

$pet_type = strstr($string, 'pet ');

这可能吗?

【问题讨论】:

  • 您希望@.com 之间有任何点吗?
  • 这可能会有所帮助stackoverflow.com/questions/1487789/…
  • explode > preg_match 如果适用。
  • 如果适用,可以。但是 2 爆炸得到一个域,那是你的代码开始变得混乱并在厕所爆炸的时候。

标签: php preg-match strstr


【解决方案1】:

或使用2次爆炸

$email  = 'name@example.com';
        $email  = explode( '@', $email);
        $email = explode('.', $email[1]);

        $email = $email[0];
        echo $email;

返回:示例

【讨论】:

    【解决方案2】:

    您自己在标签中回答问题。使用regex/preg_match,您可以查找模式并提取匹配的值。

    Here's an introduction 在正则表达式上,它看起来很吓人但并不神圣,它很合乎逻辑:)

    对于您的域示例,您可以执行以下操作:

    preg_match("@[^\.]+", $email, $matches);
    $domain = $matches[0];
    

    【讨论】:

    • 哪个会更快,但是...找到从位置 x 开始并在长度 y 之后结束的子字符串,或者搜索正则表达式?
    • 我相信正则表达式非常快。在您的解决方案中,您还需要确定“.com”扩展名,但这对于 OP 来说可能不是问题。
    • 这个正则表达式在子域(即mike@john.doe.org)的情况下导致问题
    【解决方案3】:

    尝试将substr()strpos() 结合使用

    $start = strpos($email, '@');
    $length = strpos($email, '.com') - $start;
    $domain = substr($email, $start, $length);
    

    【讨论】:

      【解决方案4】:
      $email = 'name@host.com';
      $at_pos = strpos($email, '@');
      $dot_pos = strpos($email,'.');
      $domain_length = $dot_pos - $at_pos;
      $domain = substr($email,$at_pos,$domain_length);
      echo $domain;
      

      【讨论】:

        【解决方案5】:

        我经常使用它,因为它使常规表达变得更加简单。 您可以将 ^ 添加到范围以反转它。 [^aeiou] 是除 a、e、i、o 和 u 之外的所有字符的第 th 范围。

        你的例子试试

        @[^\.]+
        

        这将匹配“@example”。

        【讨论】:

          【解决方案6】:

          您需要正则表达式

          preg_match('/@(\w+)\.com/', $email, $match);
          $domain = $match[1];
          

          见:http://www.php.net/manual/fr/book.pcre.php

          基本上,在preg_match() 调用中,我正在测试字符串$email 是否具有以下序列:一个at 符号,然后使用括号((\w+))在组中捕获的任何正数的单词字符,然后是一个点(转义:\.),最后是com。如果匹配成功,则将捕获组放入$match 数组中,并且可以使用它们从左到右的位置索引进行检索。

          可以根据您在输入中期望的字符类型来改进匹配模式。总体而言,正则表达式比简单的字符串替换要慢,但功能要强大得多。值得学习它们的工作原理。

          【讨论】:

            【解决方案7】:
            preg_match('/\@([a-zA-Z0-9-]+)?/', 'test@site-test.com', $matches);
            
            Array ( [0] => @site [1] => site )
            

            $matches[0] 是你想要使用的。

            【讨论】:

              【解决方案8】:

              你可以试试:

              $str = '';
              $email  = 'name@example.com';
              $domain = strstr($email, '@');
              $domain = str_split($domain);
              foreach($domain as $split){
              $str .= $split;
              if($split == '.'){
              break;
              }
              }
              echo $str; // prints @example
              

              或:

              $email  = 'name@example.com';
              $email = strstr($email, '@');
              $email = explode(".", $domain);
              echo $email[0]; // prints @example
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2013-10-22
                • 1970-01-01
                • 1970-01-01
                • 2020-10-19
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多