Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/271.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 从字符串中提取数据_Php_Regex_String_Preg Replace_Str Replace - Fatal编程技术网

Php 从字符串中提取数据

Php 从字符串中提取数据,php,regex,string,preg-replace,str-replace,Php,Regex,String,Preg Replace,Str Replace,我有一个字符串,想从中提取数据 $str = "Online (UVD) - 154,842 - Last Updated: Nov 23 2015 02:24 PM"; 我想要这个154842提取,这个2015我已经成功提取了第一部分。用这种方法 trim(str_replace("Online (UVD) - ", "", str_replace(",", "", substr_replace($str, "", strpos($str, " - Last Updated"))), $st

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

$str = "Online (UVD) - 154,842 - Last Updated: Nov 23 2015 02:24 PM";
我想要这个
154842
提取,这个
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";

是否有更好的提取方法?/

如果字符串始终具有相同数量的值,则可能
分解
,然后使用特定的数组位置将适合您

$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。让我们试试看-



演示:

我知道答案是肯定的,但我也考虑为以下问题提供
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
您可以检查工作代码

根据你的评论问题,你可以增强你的正则表达式来考虑这样的情况:

.-.(\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个数字。< / P>完全检查这一个我要推荐的代码。尽可能避免使用正则表达式。谢谢。我知道explode,但我没有想到:如果在他想要的值之前引入额外的空间,这将不起作用。我们应该支持

regex
而不是
explode
替换
imhoThanks mate。我真的很感激。嘿,这个
在线(UVD)-1123123-最后更新:2015年11月23日02:24 PM
这个没有被解析。在那种情况下,你有兴趣抓取哪个?第一个还是第二个?我认为你可以考虑什么时候你可以掌握你收到的信息,当这些信息仅仅是腐败的时候,你就不能简单的信任。it@AliRasheed更新了我的答案,以回答您的第二个问题:)让我知道它是否有意义!这是有道理的
Online (UVD) - 1123,123 - Last Updated: Nov 23 2015 02:24 PM
Online (UVD) - 1123#!,123 - Last Updated: Nov 23 2015 02:24 PM