explode関数で分割できない空白への対処法【PHP備忘録】

PHP

 今回は、プログラムを書いていた時にexplodeで分割できない空白文字がある場合の対処法を備忘録として記録していきたいと思います。

1.explode関数とは

 explode関数とは第一引数に、区切りの目印となる文字、第二引数に文字列を渡すことによって、第二引数の文字列を第一引数の文字で区切り、配列に変換して戻り値として返す関数になります。

<?php

$str = "I am Japanese";
$separator = " ";
$res = explode($separator,$str);

var_dump($res);
/*
array(3) { [0]=> string(1) "I" [1]=> string(2) "am" [2]=> string(8) "Japanese" }
*/
?>
PHP: explode - Manual
PHP is a popular general-purpose scripting language that powers everything from your blog to the most popular websites in the world.

2.課題と対処法

 今回、あるサイトをスクレイピングしていたところ、半角スペースで分割できない空白文字がありました。

そこで下記のサイトを見つけました。

 こちらのサイトでは、本来はURLのエンコードに使うurlencode()関数を使うと解決できるということでした。

 ただ、エンコードしたところで人間が読むには難しいただの文字コードが出力されます。

 ここでurlencode()を使って出力された文字コードに対してurldecode()を使って復号します。

 おそらく、復号した文字列はエンコード前の文字列と同じはずです。

 地道な作業ですが、復号前の文字列を1文字ずつ消していき、分割できない空白の正体を文字コードで突き止めます。

 今回の場合は「%0D%0A」が分割できない空白文字の正体であり、調べてみると改行コードでした。

 改行コードをpreg_replaceで別の文字に置き換えて問題解決となりました。

3.おまけ

 改行コードはOSによって異なるとのことで、全ての改行コードに対応する正規表現は「\r\n|\n|\r」となります。

 また、PHPでpreg_replace()を持ち置いて改行コードを示す場合のパターンは、「#\r\n|\n|\r#」となります。

 ひょんなことから沼にハマったりしてしまいますが、それがまた一つ勉強になったりしますね。

タイトルとURLをコピーしました