2

http://exämple.se/pathまたはの行に沿ってIDNURLを取得しようとしているhttps://äxämple.se/anotherpath?foo=bar&baf=basので、次のようにそのコンポーネントを取得します。

[0] http(s)://
[1] äxämple.se
[2] /anotherpath?foo=bar&baf=bas

私が最初に思ったのは「使うだけparse_url!」でした。そうですね、IDNドメインを実行しないことを除けば、運がありません。

次に、私は自分の正規表現のトリックをたくさん試しましたが、どういうわけか有用な出力を得ることができませんでした(それらのいくつかはある程度は機能していますが、それでも痛々しいほど欠けています。

最後に、他のさまざまな人々の正規表現パターンを試しましたが、どれも私にとって正しく機能していないようでした(正しく機能する=有用なものをキャプチャし、URL全体を「プロトコル」部分としてキャプチャし、他のほとんどの人は何もキャプチャしないか、明らかに機能していました私が試したものと同じです)。

そしてもちろん、なぜ私はこれをしているのですか?idn_to_asciiURLをつなぎ合わせてデータベースに保存する前に、ドメイン名で実行したいと思います。

だから、私はここで何が間違っているのですか?私のアプローチは完全に間違っていますpreg_matchか、それとも私の問題を解決する魔法の呼び出しがありますか?

ParseIDNUrl編集:できれば、他の誰かが書いたコードのブロブをダウンロードすることを含まないソリューションが欲しいです(たとえば、 100kBで計量するような名前のカスタムクラス)

4

2 に答える 2

2

parse_url正常に動作するはずです。PHP 5.3.4 を使用すると、ドメイン部分だけを抽出できました。

print parse_url('http://äxämple.se/foobar', PHP_URL_HOST);

エンコーディングを微調整する必要があるかもしれません:

print utf8_decode(parse_url('http://äxämple.se/foobar', PHP_URL_HOST));

私が得た出力は次のとおりです。

äxämple.se

それが役立つことを願っています!

于 2012-05-31T16:43:27.967 に答える
1

申し訳ありませんが、あなたの投稿を 100% 読んでいませんでした。

ここで見つけることができる正規表現は次のとおりです:適切にIDN URLに一致する

\b(([\w-]+://?|www[.])[^\s()<>]+(?:\([\w\d]+\)|([^[:punct:]\s]|/)))
于 2012-05-31T16:38:24.600 に答える