多行PHP上的数字的正则表达式

 小仙女 发布于 2023-02-13 18:37

我有一个看起来像这样的文件(是的,换行符是正确的):

39                                              9
30 30 30 31 34 30 30 32 33 32 36 30 31 38 0D 0A 00014002326018..
39 30 30 30 31 34 30 30 32 33 32 36 30 35 34 0D 900014002326054.
0A                                              .
39 30 30 30 31 34 30 30 32 33 32 36 30 39 31 0D 900014002326091.
0A                                              .
39 30 30 30 31 34 30 30 32 33 32 36 31 36 33 0D 900014002326163.
0A                                              .
39                                              9
30 30 30 31 34 30 30 32 33                      000140023
32 36 32 30 30 0D 0A                            26200..
39                                              9
30 30 30 31 34 30 30 32 33 32 36 32 30 30 0D 0A 00014002326200..
39 30 30 30 31 34 30 30 32 33 32 36 31 32 32 0D 900014002326122.
0A                                              .
39                                              9
30 30 30 31 34 30 30 32 33                      000140023
32 36 31 35 34 0D 0A                            26154..
39 30 30 30 31 34 30 30 32 33                   9000140023
32 36 31 33 31 0D 0A                            26131..
39                                              9
30 30 30 31 34 30 30 32 33                      000140023
32 36 31 30 34 0D 0A                            26104..
39 30 30 30 31 34 30 30 32 33 32 36 30 39 30 0D 900014002326090.
0A                                              .
39 30 30 30 31 34 30 30 32 33 32 36 31 39 37 0D 900014002326197.
0A                                              .
39                                              9
30 30 30 31 34 30 30 32 33 32 36 32 30 38 0D 0A 00014002326208..
39 30 30 30 31 34 30 30 32 33                   9000140023
32 36 31 31 35 0D 0A                            26115..
39                                              9
30 30 30 31 34 30 30 32 33                      000140023
32 36 31 36 34 0D 0A                            26164..
39                                              9
30 30 30 31 34 30 30 32 33                      000140023
32 36 30 31 36 0D 0A 39 30 30 30 31 34 30 30 32 26016..900014002
33                                              3
32 36 32 34 36 0D 0A                            26246..
39                                              9
30 30 30 31 34 30 30 32 33                      000140023
32 36 32 34 36 0D 0A                            26246..
39                                              9
30 30 30 31 34 30 30 32 33                      000140023
32 36 30 37 39 0D 0A                            26079..
39                                              9
30 30 30 31 34 30 30 32 33                      000140023
32 36 31 32 30 0D 0A                            26120..
39                                              9
30 30 30 31 34 30 30 32 33 32 36 32 32 38 0D 0A 00014002326228..
39 30 30 30 31 34 30 30 32 33                   9000140023
32 36 31 38 36 0D 0A                            26186..

我有这个代码来抓取EID标签(以9000开头的数字),但我无法弄清楚如何让它做多行.

$data = file_get_contents('tags.txt');

$pattern = "/(\d{15})/i";

preg_match_all($pattern, $data, $tags);
$count = 0;
foreach ( $tags[0] as $tag ){

    echo $tag . '
'; $count++; } echo "
" . $count . " total head scanned";

例如,第一行和第二行应返回900014002326018而不是忽略第一行和第二行

我对正则表达式并不擅长,所以如果你能解释,我就学会并且不再需要有人帮助我使用简单的正则表达式,这将是非常棒的.

编辑:整数是从9000开始的15位数

1 个回答
  • 你可以这样做:

    $result = preg_replace('~\R?(?:[0-9A-F]{2}\h+)+~', '', $data);
    $result = explode('..', rtrim($result, '.'));
    

    图案细节:

    \R?            # optional newline character
    (?:            # open a non-capturing group
      [0-9A-F]{2}  # two hexadecimal characters
      \h+          # horizontal white characters (spaces or tabs)
    )+             # repeat the non-capturing group one or more times
    

    更换后,您必须删除的唯一内容是两个点.删除尾随点后,您可以使用这些将字符串分解为数组.

    其他方式

    由于您知道在整数(和点)部分之前总共有48个字符,因此您也可以使用此模式:

    $result = preg_replace('~(?:^|\R).{48}~', '', $data);
    

    没有正则表达式的另一种方式

    我们的想法是逐行读取文件,因为内容之前的长度始终相同(即16*3个字符 - > 48个字符),所以用整数提取子字符串并将其连接到$data临时变量中.

    ini_set("auto_detect_line_endings", true);
    $data = '';
    $handle = @fopen("tags.txt", "r");
    if ($handle) {
        while (($buffer = fgets($handle, 128)) !== false) {
            $data .= substr($buffer, 48, -1);
        }
        if (!feof($handle)) {
            echo "Error: fgets() has failed\n";
        }
        fclose($handle);
    } else {
        echo "Error opening the file\n";
    }
    
    $result = explode ('..', rtrim($data, '.'));
    

    注意:如果文件具有Windows格式(带行尾\r\n),则必须将substr()函数的第三个参数更改为-2.如果您对如何检测换行类型感兴趣,可以查看这篇文章.

    2023-02-13 18:39 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有