実現したいこと
パスに # や () があるURLを、JavaScriptとPHPでパースしたい(parse_url
の結果や new URL()
の結果と同じものを得たい)です。
発生している問題
例えば # がある場合、parse_url()
の path
や、new URL()
の pathname
が、# の手前で終わってしまいます。
該当のソースコード
こちらです。いずれも「#」の手前で終わってしまいます。
php
1$url = 'http://example.com/episode/ルパン三世(#3)'; 2$parse = parse_url($url); // path が "/episode/ルパン三世(" になってしまう 3var_dump( $parse );
JavaScript
1var url = 'http://example.com/episode/ルパン三世(#3)'; 2var parse = new URL(url); // pathname が "/episode/%E3%83%AB%E3%83%91%E3%83%B3%E4%B8%89%E4%B8%96(" になってしまう 3console.log( parse );
試したこと
phpでは urlencode()
や rawurlencode()
をかけてみましたがこれではすべてが path
として該当していまいました。
またJavaScriptでも同じようにencodeURI()
や encodeURIComponent()
などをかけてみたのですが同じでした。
php
1$url = 'http://example.com/episode/ルパン三世(#3)'; 2$encode = urlencode($url); 3$parse = parse_url($encode); 4var_dump( $parse ); // path が全て該当してしまう 5 6$url = 'http://example.com/episode/ルパン三世(#3)'; 7$encode = rawurlencode($url); 8$parse = parse_url($encode); 9var_dump( $parse ); // path が全て該当してしまう
そしてMDNで見てますと
エスケープされないもの:
A-Z a-z 0-9 ; , / ? : @ & = + $ - _ . ! ~ * ' ( ) #
とありました。
もしかして、これらの文字列を一つずつ正規表現でパーセントエンコードする必要があるということでしょうか?例えばJavaScriptだとこうでしょうか?
JavaScript
1var url = 'http://example.com/episode/ルパン三世(#3)'; 2var encode = my_encodeURI(url); 3var parse = new URL(encode); 4console.log( parse ) 5console.log( my_decodeURI(parse.pathname) ); // 無事に pathname に "/episode/ルパン三世(#3)" が取得できる 6 7function my_encodeURI( url ){ 8 let result = encodeURI(url); 9 result = result.replace(/\#/g, '%23'); 10 result = result.replace(/\(/g, '%28'); 11 result = result.replace(/\)/g, '%29'); 12 return result; 13} 14 15function my_decodeURI( url ){ 16 let result = decodeURI(url); 17 result = result.replace(/%23/g, '#'); 18 result = result.replace(/\%28/g, '()'); 19 result = result.replace(/%29/g, ')'); 20 return result; 21}
こんな手作業でやらずともビシっとよしなにしてくれる方法がありそうに思えたので質問させて頂きました。
宜しくお願い致します。
実際の使い方
尚、実際の使い方としては、このようなaタグをクリックした際にJavaScrpitでPOSTし、phpでパスを分解する、などを想定しております。
<a href="http://example.com/episode/ルパン三世(#3)">ルパン三世(#3)</a>
回答2件
あなたの回答
tips
プレビュー