2

我对此有点困难,所以我希望你们女孩和男孩能帮忙,我有几个这样的字符串

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

我正在使用它,但它并没有按照我想要的方式工作

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

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

4

4 回答 4

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
于 2013-07-26T02:27:38.147 回答
1

You don't need lookarounds for that:

$result = preg_replace('/^([^_@]*_[^@]*)@.+/', '$1', $subject);
于 2013-07-26T05:21:24.383 回答
0

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

if (preg_match("/_.*@/", $string))
   $string = preg_replace("/@.*$/", "", $string);
于 2013-07-26T02:14:59.947 回答
0

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

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

if ($underscore !== false && $underscore < $at) {
   $string = substr($string, 0, $at);
}
于 2013-07-26T02:16:10.073 回答