Извлечение данных из строки - PullRequest
0 голосов
/ 20 декабря 2018

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

$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";

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

Ответы [ 3 ]

0 голосов
/ 20 декабря 2018

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

<?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
?>

DEMO: https://3v4l.org/ttBDG

0 голосов
/ 20 декабря 2018

Я знаю, что на этот вопрос ответили, но я думаю также о предоставлении 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 числа.

0 голосов
/ 20 декабря 2018

Если строки всегда будут иметь одинаковое количество значений, возможно, 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];
...