Можно выбрать совпадение двух символов подчеркивания:
__
. Затем сделать отрицательный взгляд вперед и посмотреть, нет ли двух символов подчеркивания перед текущей позицией:
__(?!__)
, еслиэто не так, сопоставьте любой символ:
__(?!__).
и повторите предыдущий один или несколько раз:
__((?!__).)+
и, наконец, сопоставьте еще два подчеркивания:
__((?!__).)+__
, которое является окончательным решением.
Небольшая демонстрация:
<?php
$text = '__This_is__ a __test__';
preg_match_all('/__(?:(?!__).)+__/', $text, $matches);
print_r($matches);
?>
производит:
Array
(
[0] => Array
(
[0] => __This_is__
[1] => __test__
)
)
, как видно на Ideone .
РЕДАКТИРОВАТЬ
Обратите внимание, что в моей демонстрации я использовал группу без захвата, иначе результат выглядел бы так:
Array
(
[0] => Array
(
[0] => __This_is__
[1] => __test__
)
[1] => Array
(
[0] => s
[1] => t
)
)
т.е. последний символ*
Подробнее о группах см. http://www.regular -expressions.info / brackets.html
.