Внутри вашей группировки вы хотите соответствовать одному из следующих:
- Любой символ, за которым следует любой символ, кроме
_
.
- Любой символ не
_
Regex:
/__(.[^_]|[^_])*__/
Когда первый матч первый, он продолжается. Для извлечения лучшего совпадения добавьте флаг отсутствия захвата и сопоставьте внутренний:
/__((?:.[^_]|[^_])*)__/
Пример:
$subject = 'hello __1the_re__ my name is __pe er33__';
$pattern = '/__((?:.[^_]|[^_])*)__/';
$r = preg_match_all($pattern, $subject, $match);
print_r($match[1]);
Выход:
Array
(
[0] => 1the_re
[1] => pe er33
)
Но, очевидно, гораздо проще сделать квантификатор ленивым:
/__(.+?)__/