Извлечение данных из строки

У меня есть строка, и я хочу извлечь из нее данные.

$str = "Online (UVD) - 154,842 - Last Updated: Nov 23 2015 02:24 PM";

Мне нужен этот экстракт 154,842 и этот 2015. Я успешно извлек первую часть. с этим методом

trim(str_replace("Online (UVD) - ", "", str_replace(",", "", substr_replace($str, "", strpos($str, " - Last Updated"))), $str))

Теперь я не знаю, как извлечь другой. Данные могут отличаться, например,

$str = "Online (UVD) - 1123123 - Last Updated: Nov 23 2015 02:24 PM";
$str = "Online (UVD) - 12 - Last Updated: Nov 23 2015 02:24 PM";
$str = "Online (UVD) - 1546546 - Last Updated: Nov 23 2015 02:24 PM";
$str = "Online (UVD) - 3525252525 - Last Updated: Nov 23 2015 02:24 PM";

Есть ли лучший способ извлечения? /

проверь этот regex101.com/r/NOi7wZ/1

Code Maniac 20.12.2018 17:55
Стоит ли изучать 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 и хотите разрабатывать...
2
1
318
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

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

Если строки всегда будут иметь одинаковое количество значений, возможно, explode, а затем использование определенных позиций массива подойдет вам.

$str = "Online (UVD) - 154,842 - Last Updated: Nov 23 2015 02:24 PM";
$pieces = explode(' ',$str);
echo 'Value is ' . $pieces[3] . ' and the year is ' . $pieces[9];

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

Alex Howansky 20.12.2018 17:55

Спасибо. Я знаю, что взорваться, но это не приходило мне в голову: D

Ali Rasheed 20.12.2018 18:03

Если перед желаемым значением ввести дополнительный пробел, это не сработает. Мы должны поддерживать regex вместо explode, replaces, etc imho

Diogo Santo 20.12.2018 18:09

Вы можете сделать это без использования регулярное выражение, если все слова в строке находятся в том же порядке, который вы указали. Попробуем с взорваться() -

<?php
$str = "Online (UVD) - 1123123 - Last Updated: Nov 23 2015 02:24 PM";
$str = "Online (UVD) - 12 - Last Updated: Nov 23 2015 02:24 PM";
$str = "Online (UVD) - 1546546 - Last Updated: Nov 23 2015 02:24 PM";
$str = "Online (UVD) - 3525252525 - Last Updated: Nov 23 2015 02:24 PM";

$digit = explode(' ',$str);
echo trim($digit[3]); // returns digits
echo trim($digit[9]); // returns date
?>

ДЕМО:https://3v4l.org/ttBDG

Спасибо друг. Я очень ценю это.

Ali Rasheed 20.12.2018 18:04

Я знаю, что на это дан ответ, но я думаю также предоставить решение regex для этого:

Чтобы извлечь 1-я группа, вы можете использовать следующее регулярное выражение:

preg_match('/.-.(\d+).-/', $str, $numExtracted);

if (!empty($numExtracted)) {
    echo $numExtracted[1].PHP_EOL;   
}

Чтобы извлечь ваш Год:

preg_match('/(\w\w\w).(\d\d).(\d\d\d\d)/', $str, $year, PREG_OFFSET_CAPTURE);
$year = $year[3][0];
echo $year.PHP_EOL;

Это сработало во всех следующих испытаниях:

Online (UVD) - 1123123 - Last Updated: Nov 23 2015 02:24 PM
Online (UVD) - 12 - Last Updated: Nov 23 2015 02:24 PM
Online (UVD) oi oi    -            1546546 - Last Updated: Nov 23 2015 02:24 PM
Online -sdtgstg346fg - (UVD) - 3525252525 - Last Updated:             Nov 23 2015 02:24 PM

Можете проверить рабочий код здесь

Согласно вашему комментарию, вы можете улучшить свое регулярное выражение, чтобы рассмотреть такие случаи:

.-.(\d+)?[\,\#\!\?\$\£\;\:]*(\d+)?.-

Он будет соответствовать всем вышеперечисленным плюс этим случаям:

Online (UVD) - 1123,123 - Last Updated: Nov 23 2015 02:24 PM
Online (UVD) - 1123#!,123 - Last Updated: Nov 23 2015 02:24 PM

Но я думаю, что есть время, когда вам нужно подумать, хотите ли вы сохранить полученную информацию или просто считать ее коррумпированной.

Вы даже можете ввести циклы для синтаксического анализа для каждого отдельного сценария, но если я ожидаю число, и вдруг regex, который запускает совпадение, относится к чему-то вроде 1A2B3C4G5D8D2F, я отброшу его, поскольку он идет далеко от того, что я изначально ожидал. Но все зависит от того, откуда вы получаете свою информацию, насколько вероятно, что она изменится и т. д. :)

Тем не менее, я думаю, что regex сделает вас счастливее и откроет гораздо больше возможностей.

PS: Для введенных особых случаев, поскольку число прерывается специальными символами (или даже словами, если вы их рассматриваете), оно теперь интерпретирует и 2 числа.

Привет, что насчет этого Online (UVD) - 1123,123 - Last Updated: Nov 23 2015 02:24 PM

Ali Rasheed 20.12.2018 19:10

Это не анализируется.

Ali Rasheed 20.12.2018 19:10

И что бы вам было интересно прихватить по этому поводу? 1-й или второй? Я думаю, вы можете подумать о том, когда вы можете удерживать полученную информацию, когда эта информация просто повреждена, и вы не можете просто ей доверять

Diogo Santo 20.12.2018 19:23

@AliRasheed обновил мой ответ, чтобы ответить на ваш второстепенный вопрос :) Дайте мне знать, если это имеет смысл!

Diogo Santo 20.12.2018 19:36

Это имеет смысл

Ali Rasheed 20.12.2018 19:37

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