如果匹配前遇到下划线,则匹配字符串

时间:2013-07-26 02:09:47

标签: php regex regex-lookarounds

我对此有点困难,所以我希望你们女孩和家伙可以提供帮助,我有几个像这样的字符串

foo_bar.com                  // no match
foo_bar.com@some.otherstuff  // match
foo_bar.com@some_otherstuff  // match

我正在使用它,但它的工作方式并不像我想要的那样

[^_]+(?=@).*

如果遇到下划线,那么在我想要删除@和之后的所有内容时,如果没有遇到下划线,只需保留字符串

4 个答案:

答案 0 :(得分:1)

试试这个正则表达式:

preg_replace('/((?=_).*?)@.*/', '$1', $string);

输出:

* foo_bar.com                  => foo_bar.com
* foo_bar.com@some.otherstuff  => foo_bar.com
  foobar.com@some.otherstuff   => foobar.com@some.otherstuff

答案 1 :(得分:1)

你不需要那样的解释:

$result = preg_replace('/^([^_@]*_[^@]*)@.+/', '$1', $subject);

答案 2 :(得分:0)

这需要两个步骤,首先匹配然后擦除。

if (preg_match("/_.*@/", $string))
   $string = preg_replace("/@.*$/", "", $string);

答案 3 :(得分:0)

作为正则表达式的替代方法,您可以使用基本字符串函数:

$underscore = strpos($string, '_');
$at = strpos($string, '@');

if ($underscore !== false && $underscore < $at) {
   $string = substr($string, 0, $at);
}