次のPHPコードは、複数行の文字列を配列に分解します。次に、3つのif
ステートメントを使用して、特定の行が配列に存在するかどうかを確認し、対応するテキストが存在する場合はエコーします。
$multiline_string = 'First line
Second line
Third line';
$array = explode("\n", $multiline_string);
if (in_array('First line', $array))
{
echo 'First line exists.';
}
if (in_array('Second line', $array))
{
echo 'Second line exists.';
}
if (in_array('Third line', $array))
{
echo 'Third line exists.';
}
問題は、Third line exists.
エコーされているだけであるということです。つまり、最初の行と2番目の行が配列に見つかりませんでした。
しかし、私はを使用してデバッグを行い、print_r($array)
次の出力を取得しました。
Array
(
[0] => First line
[1] => Second line
[2] => Third line
)
したがって、最初の行と2番目の行は配列に存在します。in_array
関数がそれらを見つけられなかったのはなぜですか?
何が起こっているのかを理解するには、行末をテキストファイルでどのように表現するかに関して複数の規則があることを理解する必要があります。
\n
。\r\n
。\r
。実際にはめったに発生しないため、おそらくこれについて心配する必要はありません。ウィキペディアには、これらのさまざまな標準の歴史を説明する優れた要約があります。
サンプルファイルはWindowsで作成されたように見えるため、各行の間に2文字あります。これは、最後の行を除く各行にいるときに、最後に非表示の文字が含まれることexplode()
を意味します。これが、例で最後の行だけが一致する理由です。\n
\r
複数行の文字列データの取得元に応じて、これにはいくつかの解決策があります。
状況が例に示されているとおりであり、文字列が制御するファイル内のリテラル文字列として定義されている場合、2つのオプションがあります。
$array = explode("\r\n", $multiline_string);
、Windowsの行末に基づいて爆発するようにします。一方、データがユーザー入力からのものである場合は、両方のタイプの行末を処理するようにコーディングする必要があります1。ここにもいくつかのオプションがあります。
explode()
呼び出しを$array = preg_split("/\r?\n/", $multiline_string)
、に置き換えることです。これは、\n
またはの任意のインスタンスで爆発します\r\n
。explode()
から、前と同じようにを使用します。たとえば、$multiline_string = str_replace("\r\n", "\n", $multiline_string);
。この方法は、後で文字列を使用して他のことを行う場合、たとえばデータベースに保存する場合に適しています。これは、すべての状況で両方の可能性を処理する必要がなく、これを1回だけ処理する必要があることを意味します。1または、徹底したい場合は3つのタイプすべて。これは読者のための演習として残されています...
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加