Как разделить некоторые числа и математический оператор в PHP?

Я пытаюсь создать функцию, которая принимает строку (содержащую простое математическое выражение), а затем разбивает каждую из частей на массив.

Например, ввод 2 + 3 * 7 или 2 – 5 / 3.4, вывод должен быть как ["2", "+", "3", "*", "7"] и ["2", "-", "5", "/", "3.4"]

Вот мои коды:

$input = "2 + 3 * 7";
$input = "2-5/3.4";

function splitExpression($string) {
    $result = explode (" ", $input);
    print_r ($result);
}

Используя только взрыв, конечно, 1-й пример работает хорошо, но не то же самое с другим.

Возможный дубликат Пытаюсь разбить строку на 3 переменные, но немного сложнее - PHP

Alperen Kantarcı 30.04.2019 08:30
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
1
800
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Вы можете использовать для этого str_split(). Нравиться str_split($str1);

$input = "2-5/3.4";
$input = "2 + 3 * 7";

function splitExpression($string) {
    //$result = str_split (string);
    $result = str_split (preg_replace('/\s+/', '', $string));
    return $result;
}
$arr1 = splitExpression($input);

Где preg_replace('/\s+/', '', $string) используется для удаления пробелов из строки.

Что, если строка 30 + 4 *2? Или 40+3.4? Или первый из $input? Это не работает. Это будет работать только тогда, когда есть целые числа, нет десятичных знаков и нет числа больше 9. Довольно сильное ограничение.

Qirel 30.04.2019 08:46

вы можете использовать регулярное выражение:

$matches = array();
$input = "2 + 3 * 7 / 5 - 3";
preg_match_all("/\d+|[\\+\\-\/\\*]/",$input,$matches);

это регулярное выражение ищет число или оператор и помещает совпадения в $matches. можно редактировать оформление массива совпадений по флажкам.

matches:
 + 0
     - 0 : 2
     - 1 : +
     - 2 : 3
     - 3 : *
     - 4 : 7
     - 5 : /
     - 6 : 5
     - 7 : -
     - 8 : 3

Это регулярное выражение недопустимо.

Qirel 30.04.2019 08:49
Ответ принят как подходящий

Можно попробовать так - на основе ответа в другом месте стека. Изменил шаблон и добавил preg_replace, чтобы на результаты не влияли пробелы во входной строке.

$input = '2 + 3 * 7';
$input = '2-5/3.4';


$pttn='@([-/+\*])@';
$out=preg_split( $pttn, preg_replace( '@\s@', '', $input ), -1, PREG_SPLIT_DELIM_CAPTURE );

printf('<pre>%s</pre>',print_r( $out, true ) );

Выведет:

Array
(
    [0] => 2
    [1] => -
    [2] => 5
    [3] => /
    [4] => 3.4
)

Обновлять:

$input = '2 + 5 - 4 / 2.6';


$pttn='+-/*';   # standard mathematical operators
$pttn=sprintf( '@([%s])@', preg_quote( $pttn ) ); # an escaped/quoted pattern

$out=preg_split( $pttn, preg_replace( '@\s@', '', $input ), -1, PREG_SPLIT_DELIM_CAPTURE );

printf('<pre>%s</pre>',print_r( $out, true ) );

выходы:

Array
(
    [0] => 2
    [1] => +
    [2] => 5
    [3] => -
    [4] => 4
    [5] => /
    [6] => 2.6
)

вы имеете в виду как в правиле "BODMAS"?

Professor Abronsius 30.04.2019 08:55

нет, я не верю, что это произойдет, но тогда это не было частью вопроса и, по сути, потребовало бы совершенно нового вопроса.

Professor Abronsius 30.04.2019 08:58

Вышеупомянутый вопрос не решается вашим ответом, потому что сначала он вычисляет 2-5, а затем деление...

Veshraj Joshi 30.04.2019 09:01

взгляните на вопрос - особенно "The output should be like ....."

Professor Abronsius 30.04.2019 09:04

@RamRaider, не могли бы вы рассказать мне больше о $pttn='@([-/+\*])@'; как ограничителе? Потому что, когда я меняю/переупорядочиваю его, меняется вывод.

marcato21 30.04.2019 09:16

Я думаю, что изначально, когда я писал, что мне повезло в первый раз, так как когда я изменил порядок, он выдал ошибки, а не другой порядок - из-за того, что я уверен, что не убегу от определенных элементов в шаблоне. Я добавлю измененный фрагмент выше, который правильно экранирует математические операторы.

Professor Abronsius 30.04.2019 09:31

Другие вопросы по теме