2016-05-12 8 views
0

PHPでライセンスキーリストを解析しています。 結果は期待通りではありません。 問題は特殊文字 '<'によって発生するようです。 誰かが解決策を考えているといいですね。preg_split() '<'を含む文字列

$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&[email protected] 
X&PHNAGN+X><NZYN#9'; 

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

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

OUTPUT

[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&[email protected] 
[9] => X&PHNAGN+X> 
+2

問題がありますか、ソースを確認しましたか?結果を見るためにブラウザを使用している場合、ブラウザはおそらくそれがオープニングhtmlタグであると考えます。 – jeroen

答えて

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&[email protected] 
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&[email protected] 
X&PHNAGN+X><NZYN#9 

、@Marcin Orlowskiが指摘したように、単に、この行を分割するために、あなたがしているexplodeを選ぶことができますがfaster

+0

ありがとう、私はhtmlentitiesを忘れました。データベース内のデータは正しいです。問題が解決されました – mcxbain

0

あなたのケースでpreg_split()を使用してから何の恩恵はありません。ちょうど同じ結果を

$file_array = file($filename, FILE_IGNORE_NEW_LINES); 

を行い、代わりに

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

を使用するか、コンテンツがファイルから読み込まれている場合。

EDIT

が、結果は、あなたが、出力があなたの質問と同じであることを意味している場合、この

のように見えるべきである - それは正しい出力であるため、はい、それは、あります。問題は、あなたがHTMLマークアップの一部として<...と考えるかもしれないウェブブラウザでこれを見ていることです。 print_r()の前にecho '<pre>';を追加して、これを防止するか、コンソールでスクリプトを実行してください。

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&[email protected] 
X&PHNAGN+X><NZYN#9 
EOT; 

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

print_r($file_array); 

PHPのCLI上の明白な出力は次のようになります。あなたが持っているブラウザを表示するHTMLでその結果を視覚化する

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&[email protected] 
    [8] => X&PHNAGN+X><NZYN#9 
) 

注意htmlの特定の文字(たとえば、<および>)をエスケープします。しかし、それは入力文字列を分割することとは何の関係もなく、あなたの質問についてです。

+0

heredocを使用しても、ブラウザは自動的にHTMLタグを解析します – Thamilan

+0

@Thamilan申し訳ありませんが、そこに行くことはできません。まず、それは 'heredoc'ではなく、' nowdoc'の定義です。次に、文字列の定義はブラウザとまったく関係がありません。これはサーバー側の文字列を定義し、ブラウザーは関係しません。 – arkascha

+0

はい、しかし、テキストがブラウザに表示されている間は、印刷前にオープンタグとクローズタグを確実に処理しますが、OPのコンセプトは端末やコンソールで機能します – Thamilan

関連する問題