从字符串中提取数据
Extracting data from a string
我有一个字符串,想从中提取数据。
$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";
有没有更好的提取方法?/
如果字符串始终具有相同数量的值,也许 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];
如果字符串中的所有单词都与您提供的顺序相同,则无需使用 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
?>
我知道这已得到解答,但我想也为此提供 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 个数字。
我有一个字符串,想从中提取数据。
$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";
有没有更好的提取方法?/
如果字符串始终具有相同数量的值,也许 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];
如果字符串中的所有单词都与您提供的顺序相同,则无需使用 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
?>
我知道这已得到解答,但我想也为此提供 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 个数字。