Чтобы оценить положительные и отрицательные знаки так, чтобы все положительные символы игнорировались, а два отрицательных равнялись положительным, вы можете выполнить замену.
Код: ( Демо )
$signed_number_strings = ["--1", "---33", "+-444"];
foreach ($signed_number_strings as $string) {
var_dump((int)preg_replace('~\++|-\+*-\+*~', '', $string));
}
Выход:
int(1)
int(-33)
int(-444)
Логика, лежащая в основе шаблона, заключается в том, чтобы сначала сопоставить / удалить 1 или более последовательных +
знаков, ИЛИ знак -
, за которым следует ноль или более +
, за которыми следует -
(и поглощение любого трейлинга +
приметы). Если есть какие-либо дополнительные случаи, которые мой шаблон не обрабатывает правильно, пожалуйста, обновите ваш вопрос и оставьте мне комментарий.
p.s. Расширение моей второй ветви с помощью \+*
является попыткой оптимизировать шаблон, чтобы он не перезапускал шаблон. Это можно было бы записать как ~\++|-\+*-~
, что было бы немного меньше нагрузки на глазные яблоки. ( Демо ) * * тысяча двадцать две