preg_split()的字符串包含'<';


preg_split() with strings containing '<'

I在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>

您的拆分工作正常,唯一的问题是浏览器将这些符号转换为标记并导致这种情况。你可以通过运行这个来检查(我使用了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所指出的,只需分割这条线,你就可以选择更快的爆炸。

在您的案例中使用preg_split()没有任何好处。使用

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

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

$file_array = file($filename, FILE_IGNORE_NEW_LINES);

以获得相同的结果。

编辑

但结果应该像这个

如果你的意思是输出与你的问题相同——是的,因为它是正确的输出。问题是,您在web浏览器中查看此内容,然后可能会将<...视为HTML标记的一部分。在print_r()之前添加echo '<pre>';以防止这种情况发生,或者在控制台中运行脚本。

您的代码经过一些小的修改后运行良好:

<?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特定的字符(如<>)。但这与拆分输入字符串无关,您的问题是关于什么的。