改行可能なスペースを
HTML エンティティに置き換えるよりも安全な選択は、\xA0
ASCII 文字に置き換えることです。それらは実質的に同等です。の&
文字はURL
パラメータ区切り文字と見なされるため、
問題が発生する可能性があります。次のアルゴリズムは、おそらく探していることを実行できます。
$url = 'http://www.site.com/index.php?q=foo boo&r=fii bii';
echo str_replace("\x20", "\xA0", $url);
// result: http://www.site.com/index.php?q=foo boo&r=fii bii (spaces are non-breakable)
echo str_replace("\x20", " ", $url);
// result: http://www.site.com/index.php?q=foo boo&r=fii bii
より複雑なアルゴリズム:
echo preg_replace_callback('/[\?&]\w+=([^&]+)/', create_function(
'$matches',
'return str_replace("\x20", "\xA0", $matches[0]);'
), $url);
// result: http://www.site.com/index.php?q=foo boo&r=fii bii (spaces are non-breakable)
そして、これらのパラメータが抽出されると:
$arr = parse_url($url);
parse_str($arr['query'], $arr);
var_export($arr);
// result for \xA0 : array ( 'q' => 'foo boo', 'r' => 'fii bii', )
// result for : array ( 'q' => 'foo', 'nbsp;boo' => '', 'r' => 'fii', 'nbsp;bii' => '', ) // triple `&` in conflict