【问题标题】:Regex, get string value between two characters正则表达式,获取两个字符之间的字符串值
【发布时间】:2010-01-09 19:47:50
【问题描述】:

我想返回两个字符之间的字符串,@ 和点 (.)。

我尝试使用正则表达式,但无法正常工作。

(@(.*?).)

有人吗?

【问题讨论】:

  • 那些外括号是干什么用的?他们是你的分隔符吗?这可能是个问题。
  • 如果有多个@字符或多个点怎么办?
  • [无关] 关于正则表达式,我想提醒人们这个有趣的答案:stackoverflow.com/questions/1732348/#1732454

标签: php regex


【解决方案1】:

您的正则表达式几乎可以正常工作,只是您忘记了转义句号。此外,在 PHP 中,您需要分隔符:

'/@(.*?)\./s'

s 是DOTALL modifier

这是一个完整的例子,说明如何在 PHP 中使用它:

$s = 'foo@bar.baz';
$matches = array();
$t = preg_match('/@(.*?)\./s', $s, $matches);
print_r($matches[1]);

输出:

bar

【讨论】:

  • 抱歉,我没有注意到他使用的是多行字符串。更新了答案。
  • andreas 并没有说他正在使用带有换行符的字符串,我只是提到如果他是,那么建议的解决方案将不起作用。现在当然可以了。
  • 啊,是的,我现在明白了。我想知道他是否在尝试解析电子邮件……不过只是猜测。
  • 我尝试获取电子邮件地址域。 @Mark Byers,您的示例用“未知修饰符@”向我射击。在 @ 之前添加 \ 时得到空白页。该死,讨厌正则表达式:-)
  • 同样@是地址第一部分的有效字符,只要它被转义或用引号括起来,例如"firstname@lastname"@example.com - 请参阅第 6 页 apps.ietf.org/rfc/rfc3696.html。您应该考虑使用符合标准的电子邮件解析器,而不是尝试自己动手。
【解决方案2】:

试试这个正则表达式:

@([^.]*)\.

表达式[^.]* 将匹配除点以外的任意数量的任意字符。并且普通的点需要转义,因为它是一个特殊字符。

【讨论】:

  • 效果很好。谢谢。
【解决方案3】:

这是最好和快速使用的

function get_string_between ($str,$from,$to) {

    $string = substr($str, strpos($str, $from) + strlen($from));

    if (strstr ($string,$to,TRUE) != FALSE) {

        $string = strstr ($string,$to,TRUE);

    }

    return $string;

}

【讨论】:

    【解决方案4】:

    如果你正在学习正则表达式,你可能也想分析一下:

    @\K[^.]++(?=\.)
    
    (?<=@)[^.]++(?=\.)
    

    这两个正则表达式都使用所有格量词 (++)。尽可能使用它们,以防止不必要的回溯。此外,通过使用环视结构(或\K),我们可以匹配$matches[0]@. 之间的部分。

    【讨论】:

      猜你喜欢
      • 2014-12-08
      • 1970-01-01
      • 1970-01-01
      • 2012-05-30
      • 1970-01-01
      • 1970-01-01
      • 2011-08-04
      相关资源
      最近更新 更多