分解条件为一组特定字符的字符串



我正在寻找一种分解字符串的方法。例如,我有以下字符串:(我们不计算开头-0x(

0xa9059xbb000000000000000000000000fc7a5f48a1b3f48e7dcb1f23a1ea24199af4d00000000000000000000000000000000000000000054368

这实际上是一个ETH交易输入。我需要把这根绳子分解成三部分。假设一组零实际上是一个单独的空间,这些空间定义了字符串应该分解的门。

我该怎么做?

preg_split((

此函数使用正则表达式来拆分字符串
因此,在本例中,在一行中的两个或多个0处:

$arr = preg_split('/[0]{2,}/', $string);
print_r($arr);
echo PHP_EOL;

这将输出以下内容:

Array
(
[0] => a9059xbb
[1] => fc7a5f48a1a1b3f48e7dcb1f23a1ea24199af4d
[2] => 54368
)

请注意,如果消息本身包含00,则会出现问题;字符串的末尾";,但这不会发生。

preg_match((

这是一个使用正则表达式的示例。您可以在任意点进行拆分。

$string = 'a9059xbb000000000000000000000000fc7a5f48a1a1b3f48e7dcb1f23a1ea24199af4d00000000000000000000000000000000000000000000000000000000000054368';
print_r($string);
echo PHP_EOL;
$res = preg_match('/(.{4})(.{32})(.{32})/', $string, $matches);
print_r($matches);
echo PHP_EOL;

该输出:

a9059xbb000000000000000000000000fc7a5f48a1a1b3f48e7dcb1f23a1ea24199af4d00000000000000000000000000000000000000000000000000000000000054368
Array
(
[0] => a9059xbb000000000000000000000000fc7a5f48a1a1b3f48e7dcb1f23a1ea24199a
[1] => a905
[2] => 9xbb000000000000000000000000fc7a
[3] => 5f48a1a1b3f48e7dcb1f23a1ea24199a
)

正如您所看到的,/(.{4})(.{32})(.{32})/将找到4个字节,然后是32,然后又是32。捕获组是用()围绕您想要查找的内容创建的。它们出现在$matches数组中(0始终是找到的整个字符串(。

如果你想忽略某些部分,你也可以表达出来:

/(.{4})9x(.{32}).{4}(.{32})/

这将更改找到的字符串:

Array
(
[0] => a9059xbb000000000000000000000000fc7a5f48a1a1b3f48e7dcb1f23a1ea24199af4d000
[1] => a905
[2] => bb000000000000000000000000fc7a5f
[3] => a1b3f48e7dcb1f23a1ea24199af4d000
)

链接

上述函数的PHP文档:
https://www.php.net/manual/en/function.preg-split.php
https://www.php.net/manual/en/book.pcre.php

使用此演示演示第二个正则表达式:
https://regex101.com/r/pfZtH8/1

如果您总是在相同的点(4字节(8个十六进制数字(、32字节(64个十六进制位数(、32个字节(64位十六进制数码((分解它们,您可以使用substr((。

$input = "0xa9059xbb000000000000000000000000fc7a5f48a1a1b3f48e7dcb1f23a1ea24199af4d00000000000000000000000000000000000000000000000000000000000054368";
$first = substr($input,2,8);
$second = substr($input,10,64);
$third = substr($input,74,64);
print_r($first);
print "<br>";
print_r($second);
print "<br>";
print_r($third);
print "<br>";

该输出:

a9059xbb
000000000000000000000000fc7a5f48a1a1b3f48e7dcb1f23a1ea24199af4d0
0000000000000000000000000000000000000000000000000000000000054368

最新更新