我有一个看起来像这样的文件(是的,换行符是正确的):
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位数
你可以这样做:
$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
.如果您对如何检测换行类型感兴趣,可以查看这篇文章.