Как извлечь из строки нужные данные?

101
27 февраля 2021, 22:30

Есть переменная с таким содержанием:

string(544) "
Seats: 11;12;
Name: qqqq;wwww;
Start: Прешов, АВ Košická 2725/2
End: Мукачево, АЗ Лавковская, 1б
Date: 2019-06-22
Time: 09:40 PM
"

Мне из всех этих данных нужно извлечь и сохранить

Seats: 11;12;

только без слова "Seats: ". В итоге, для дальнейшей работы, я хотел бы получить массив:

[0]=>11
[1]=>12

Перепробовал множество вариантов, не смог решить этот вопрос.

Вот последнее, что я смог сделать, но не работает:

$re = '/\s+([\d;]+)/';
$str = $item['meta'];
$wt_name = preg_split($re, $str);

Результат:

array(3) { [0]=>
string(260) "
Seats: 11;12;
Name: qqq;www;
Start: Прешов,
АВ Košická" [1]=>
string(111) "/2
End: Мукачево,
АЗ Лавковская,"
[2]=> string(166)
"б
Date: 2019-06-24
Time: 09:40 PM
" }

Пожалуйста, помогите написать правильное регулярное выражение

Answer 1

зачем вы делаете split? вам нужен preg_match и если надо строку seats то и используйте ее в выражении

preg_match("/Seats: (.*);$/m", $txt, $matches);

должны получить искомые 11;12; в $matches[1], а дальше можете сделать explode() по разделителю ;

Answer 2

В итоге, для дальнейшей работы, я хотел бы получить массив: [0]=>11 [1]=>12

$str = 'Seats: 11;12;
Name: qqqq;wwww;
Start: Прешов, АВ Košická 2725/2
End: Мукачево, АЗ Лавковская, 1б
Date: 2019-06-22
Time: 09:40 PM';
if (preg_match('~Seats:\h*(\d+);(\d+)~', $str, $arr)) {
    array_shift($arr);
}
var_dump($arr);

Демо PHP

Answer 3

Всю работу можно выполнить в явном виде:

  • Разделить входные данные на строки
  • Разделить строки на ключ/значение
$str = "Seats: 11;12;
Name: qqqq;wwww;
Start: Прешов, АВ Košická 2725/2
End: Мукачево, АЗ Лавковская, 1б
Date: 2019-06-22
Time: 09:40 PM";
$lines = explode("\n", trim($str));
$data = array_reduce(array_filter($lines), function($res, $line){
    [$key, $value] = preg_split('#\s*:\s*#', $line, 2);
    $res[$key] = $value;
    return $res;
}, []);
var_dump($data);
// Далее, можно работать с полями, в зависимости от их назначения и формата
preg_match_all('#(\d+);#', $data['Seats'], $m);
var_dump($m[1]);

3v4l

array(6) {
  ["Seats"]=>
  string(6) "11;12;"
  ["Name"]=>
  string(10) "qqqq;wwww;"
  ["Start"]=>
  string(35) "Прешов, АВ Košická 2725/2"
  ["End"]=>
  string(48) "Мукачево, АЗ Лавковская, 1б"
  ["Date"]=>
  string(10) "2019-06-22"
  ["Time"]=>
  string(8) "09:40 PM"
}
array(2) {
  [0]=>
  string(2) "11"
  [1]=>
  string(2) "12"
}
Answer 4

Можно извлечь все числа, разделённые точкой с запятой после Seats: с помощью одного регулярного выражения:

if (preg_match_all('~(?:\G(?!^);|Seats:\s*)\K\d+~',$txt,$matches)) {
    print_r($matches[0]);
}

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

Подробности

  • (?:\G(?!^);|Seats:\s*) - конец предыдущего совпадения и точка с запятой или Seats: и 0+ пробельных символов
  • \K - оператор, очищающий буфер целого совпадения
  • \d+ - 1 и более цифр.
READ ALSO
Как получить все ID элементов?

Как получить все ID элементов?

На странице есть неопределенное количество ссылок вида:

140
Ошибка синтаксиса на PHP 7.1

Ошибка синтаксиса на PHP 7.1

Подскажите, почему получаю ошибку на PHP 71

104
Синтаксическая ошибка }

Синтаксическая ошибка }

Я установил ubuntu и развернул проект у себя на локалке, после запуска выдает слелующую ошибку:

112
TypeForm WebHook пустое тело $_request

TypeForm WebHook пустое тело $_request

Подключил обработчик для получения вебхука с typeformcom Запрос уходит в формате JSON, в $_request, $_post, php://input - пусто

120