我的输入字符串:
Yth。 ErzaPay.com(DS008206)。萨尔:465.670,德尔姆·普罗斯:0。佩马卡小时 ini:126.885 Komisi:0#* IDN1,IDN3打开harga naik
如何获取字符串值465.670
?
答案 0 :(得分:4)
如果这是相当严格的格式,则可以使用explode来获取值。
其他选择使用正则表达式。
$temp = explode("Sal:",$str);
$sal = explode(",", $temp[1])[0];
echo $sal; //465.670
答案 1 :(得分:1)
$string = "Yth. ErzaPay.com (DS008206). Sal:465.670, Dlm proses:0. Pemakaian hr ini:126.885 Komisi:0 #*IDN1,IDN3 Open harga naik";
$matches = [];
preg_match_all('/(\w+):([\.\d]+)/', $string, $matches);
// var_dump($matches);
$matches = [];
preg_match_all('/Sal:([\.\d]+)/', $string, $matches);
// var_dump($matches);
var_dump($matches[1][0]);
答案 2 :(得分:0)
我更喜欢preg_match()
来完成这项任务。最好先匹配标识子字符串,然后用\K
重置完整的字符串匹配,然后匹配1个或多个不是逗号的字符。工作完成。
使用preg_match_all()
提取单个字符串没有逻辑意义。
我不希望连续爆炸,因为它在隔离子字符串的过程中正在生成数组。换句话说,它只是间接的。如果要在搜索单独的子字符串时使用explode()
将字符串分成较小的块,请使用2
的第三个参数,这样php不会继续寻找更多的分隔符来爆炸
strstr()
和第三个参数true
会提取第一个遇到的子字符串之前的子字符串部分,因此可以使用它代替第二个explode()
调用。
我可以列举其他一些怪诞的技术,但是最终,正则表达式提供了直接而简洁的解决方案,因此我可能会在生产代码中使用preg_match()
。
您不清楚输入字符串的变化方式。我只提供了适合您确切输入的技术。
代码:(Demo)
$input = 'Yth. ErzaPay.com (DS008206). Sal:465.670, Dlm proses:0. Pemakaian hr ini:126.885 Komisi:0 #*IDN1,IDN3 Open harga naik';
echo preg_match('~Sal:\K[^,]+~', $input, $out) ? $out[0] : 'no match';
echo "\n---\n";
echo preg_replace('~^.*?Sal:|,.*?$~', '', $input);
echo "\n---\n";
echo strstr(explode('Sal:', $input, 2)[1], ',', true);
echo "\n---\n";
echo explode(',', explode('Sal:', $input, 2)[1], 2)[0];
echo "\n---\n";
if (($startPos = strpos($input, 'Sal:')) !== false && ($endPos = strpos($input, ',', $startPos)) !== false) {
$substrPos = $startPos + 4;
$substrLen = $endPos - $substrPos;
echo substr($input, $substrPos, $substrLen);
}
输出:
465.670
---
465.670
---
465.670
---
465.670
---
465.670