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

そのためのルックアラウンドは必要ありません。

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

これには、最初に一致させてから消去するという 2 つの手順が必要です。

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 に答える