从字符串中提取数据

时间:2018-12-20 16:49:09

标签: php regex string preg-replace str-replace

我有一个字符串,想从中提取数据。

$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 :(得分: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];

答案 1 :(得分:1)

如果字符串中的所有单词都与您提供的顺序相同,则可以不使用 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
?>

演示: https://3v4l.org/ttBDG

答案 2 :(得分:0)

我知道答案是正确的,但我想也为此提供regex解决方案:

要提取您的第一组,可以使用以下正则表达式:

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

您可以检查工作代码here

根据您的评论问题,您可以增强正则表达式以考虑此类情况:

.-.(\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个数字。