preg_split()包含'<'

时间:2016-05-12 06:56:05

标签: php preg-split

我在php中解析许可证密钥列表。 不幸的是,结果并不像预期的那样。 似乎问题是由特殊字符'出现的。 如果有人知道可能的解决方案,那就太好了。

$file_content = '
HM$WN*G&Z58CY8FPUA
F*QZHZGK#&*@*492&T
JJKXP<GZRPKGS7J!EW
P8ZHZ<GCNNR6X=Z7PW
C6HXQFGJ*Y2+#SDZT9
BYYYMEGMQ73G5K#U7F
P>+F=GG7F*U#<RT!6H
B+ZZYTGX&LF6@6XUXU
X&PHNAGN+X><NZYN#9';

$file_array = preg_split("/\n/", $file_content);

echo '<pre>';
print_r($file_array);

输出

[0] => 
[1] => HM$WN*G&Z58CY8FPUA
[2] => F*QZHZGK#&*@*492&T
[3] => JJKXP P8ZHZ C6HXQFGJ*Y2+#SDZT9
[6] => BYYYMEGMQ73G5K#U7F
[7] => P>+F=GG7F*U# B+ZZYTGX&LF6@6XUXU
[9] => X&PHNAGN+X>

3 个答案:

答案 0 :(得分:0)

在您的案例中使用import { beforeEachProviders, it, describe, expect, inject } from '@angular/core/testing'; import {Http, BaseRequestOptions, Response, ResponseOptions} from '@angular/http'; import {MockBackend} from '@angular/http/testing'; import {provide} from '@angular/core'; import { BoardServiceService } from './board-service.service'; describe('BoardService Service', () => { beforeEachProviders(() => [ BaseRequestOptions, MockBackend, Response, BoardServiceService, provide(Http, { useFactory: (backend, defaultOptions) => new Http(backend, defaultOptions), deps: [MockBackend, BaseRequestOptions] }) ]); it('should get me a list of items (array type) on subscribe', inject([BoardServiceService, MockBackend], (service: BoardServiceService, MockBackend) => { const resultSet = [{}]; const response = new Response(new ResponseOptions({body:resultSet, status:200})); MockBackend.connections.subscribe(connection => connection.mockRespond(response)); BoardServiceService.loadBoards().subscribe(res => expect(res.length).toEqual(1)); })); }); 没有任何好处。使用

preg_split()

相反,或者如果正在从文件中读取内容,只需执行

$file_array = explode("\n", $file_content);

得到相同的结果。

修改

  

但结果应该是这样的

如果您的意思是输出与您的问题相同 - 是的,因为它是正确的输出。问题是您在Web浏览器中查看此内容,然后可能会将$file_array = file($filename, FILE_IGNORE_NEW_LINES); 视为HTML标记的一部分。在<...之前添加echo '<pre>';以阻止此操作或在控制台中运行脚本。

答案 1 :(得分:0)

您的拆分工作原理应该是这样,只有浏览器将这些符号转换为标记并导致它。你可以通过运行它来检查(我使用htmlentities):

<?php
$file_content = '
HM$WN*G&Z58CY8FPUA
F*QZHZGK#&*@*492&T
JJKXP<GZRPKGS7J!EW
P8ZHZ<GCNNR6X=Z7PW
C6HXQFGJ*Y2+#SDZT9
BYYYMEGMQ73G5K#U7F
P>+F=GG7F*U#<RT!6H
B+ZZYTGX&LF6@6XUXU
X&PHNAGN+X><NZYN#9';

$file_array = preg_split("/\n/", $file_content);

array_map("HTMLescape", $file_array);

function HTMLescape($a) {
    echo "<pre>".htmlentities($a)."</pre>";    
}

输出:

HM$WN*G&Z58CY8FPUA
F*QZHZGK#&*@*492&T
JJKXP<GZRPKGS7J!EW
P8ZHZ<GCNNR6X=Z7PW
C6HXQFGJ*Y2+#SDZT9
BYYYMEGMQ73G5K#U7F
P>+F=GG7F*U#<RT!6H
B+ZZYTGX&LF6@6XUXU
X&PHNAGN+X><NZYN#9

此外,正如@Marcin Orlowski指出的那样,只要拆分此行,您就可以选择explode faster

答案 2 :(得分:0)

您的代码工作正常,只做了一些小修改:

<?php

$file_content = <<<'EOT'
HM$WN*G&Z58CY8FPUA
F*QZHZGK#&*@*492&T
JJKXP<GZRPKGS7J!EW
P8ZHZ<GCNNR6X=Z7PW
C6HXQFGJ*Y2+#SDZT9
BYYYMEGMQ73G5K#U7F
P>+F=GG7F*U#<RT!6H
B+ZZYTGX&LF6@6XUXU
X&PHNAGN+X><NZYN#9
EOT;

$file_array = preg_split("/\n/", $file_content);

print_r($file_array);

php cli的明显输出是:

Array
(
    [0] => HM$WN*G&Z58CY8FPUA
    [1] => F*QZHZGK#&*@*492&T
    [2] => JJKXP<GZRPKGS7J!EW
    [3] => P8ZHZ<GCNNR6X=Z7PW
    [4] => C6HXQFGJ*Y2+#SDZT9
    [5] => BYYYMEGMQ73G5K#U7F
    [6] => P>+F=GG7F*U#<RT!6H
    [7] => B+ZZYTGX&LF6@6XUXU
    [8] => X&PHNAGN+X><NZYN#9
)

请注意,要在html显示浏览器中显示该结果,您必须转义html特定字符(例如<>)。但这与拆分输入字符串无关,你的问题是什么。