Regexp для обработки строк типа "test-12-1" (php)

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

test-12-1

blabla12412-5

t-dsf-gsdg-x-10

до следующих матчей:

test и 1

blabla12412 и 5

t-dsf-gsdg-x и 10

Я пытаюсь достичь его, используя что-то вроде

$matches = [];
preg_match('/^[a-zA-Z0-9]+(-\d+)+$/', 'test-12-1', $matches);

Но я получил неожиданный результат:

 array (
   0 => 'test-12-1',
   1 => '-1',
 )

Вы можете двигаться вперед с помощью на этой площадке: https://ru.functions-online.com/preg_match.html?command = {"pattern":"/^[a-zA-Z0-9 fastented+(-\d+)+$/","subject ": "тест-12-1"}

Большое спасибо!

вы хотите test-12 и 1 или test, 12 и 1. В вашем вопросе непонятно

ArtisticPhoenix 22.12.2018 08:54
Стоит ли изучать 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
61
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете использовать

'~^(.*?)(?:-(\d+))+$~'

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

Подробности

  • ^ - начало строки
  • (.*?) - Группа 1: любые ноль или более символов, кроме символов разрыва строки, как можно меньше
  • (?:-(\d+))+ - 1 или более вхождений
    • - - дефис
    • (\d+) - Группа 2: одна или несколько цифр (последнее вхождение сохраняется в значении группы, поскольку оно находится в повторяющейся группе без захвата)
  • $ - конец строки.

Есть ли здесь какое-то преимущество перед просто ^ (. *?) - (\ d +) + $, так как это все равно захватит последнюю группу?

Mark 22.12.2018 01:12

Спасибо за полезный ответ! Но «тест-12-1» обрабатывают как «тест» и «1» вместо «тест-12» и «1» ...

NewEXE 22.12.2018 01:12

@NewEXE Посмотрите на свой вопрос, это то, о чем вы просили. test-12-1 должен давать test и 1. В противном случае используйте '~^(.*)-(\d+)$~', см. эта демонстрация.

Wiktor Stribiżew 22.12.2018 01:28

@Wiktor Stribiew, совсем плохо, извините за это! Мне нужно больше спать...

NewEXE 22.12.2018 20:02

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