如何从特定子字符串之后的字符串中获取值?

时间:2019-07-13 06:09:18

标签: php regex preg-match

我的输入字符串:

  

Yth。 ErzaPay.com(DS008206)。萨尔:465.670,德尔姆·普罗斯:0。佩马卡小时   ini:126.885 Komisi:0#* IDN1,IDN3打开harga naik

如何获取字符串值465.670

3 个答案:

答案 0 :(得分:4)

如果这是相当严格的格式,则可以使用explode来获取值。
其他选择使用正则表达式。

$temp = explode("Sal:",$str);
$sal = explode(",", $temp[1])[0];

echo $sal; //465.670

https://3v4l.org/Z6GfF

答案 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