wisgest, а как же валидировать данные?)) Если у вас там две @, то это не корректный Email и это должно обрабатываться по другому
if (false === \filter_var($value, FILTER_VALIDATE_EMAIL)) {
new InvalidArgumentException('Expected a value to be a valid e-mail address');
}
в моём случае это делается с помощью бибилиотеки Webmozart/Assert. И в итоге при $parts = explode('@', $this->getValue()); будет только валидный email, который можно разбить на 2 части. В код не должны попадать данные, которых вы не ожидате.
Необязательно, я привёл пример корректного и ваше решение с explode с корректным адресом (конечно, не каждая почтовая служба позволит такой создать, но в общем случае он теоретически допустим) будет работать некорректно.
wisgest, поэтому я и говорю, что валидировать надо строку на email) представьте что вы не только получаете вторую часть после собаки, но и сохраняете этот email. Если вы передали простую строку, в которой пытаетесь найти @, то вы можете не найти ничего. А в базу сохранится строка, которая не является email.
Но если в общем пытаться поддерживать RFC то там и регулярки будут сумасшедшие. Я сейчас не встречаю обычных пользователей, которые бы пользовались сложными почтовыми адресами. Поэтому, по мне, лучше не усложнять себе жизнь и не пытаться поддерживать все подряд адреса, а сразу обозначить, что поддерживаются классические адреса, аля "xxx@xxxxxx.xxx" . Тогда для разбора хватит explode с лимитом 2. Остальные адреса считать не валидными (даже если валидны по RFC).