正規表現でURLを置換したい
created: 2007-08-30 16:07 | modified: 2007-08-30 23:38 | reply: 5
[3883] 正規表現でURLを置換したい
user: 江戸川アダモ | created: 2007-08-30 16:07
度々お世話になります。
今回は、イマイチよく判らない正規表現の問題です。
掲示板などで記事内にURLがあった場合、HTMLのリンクに置換したいので:
http://au2.php.net/manual/ja/function.ereg-replace.php
のやり方に従うとうまく行きました。
ただ”[[:alpha:]]+://[^<>[:space:]]+[[:alnum:]/]”が何故URLのパターンなのかがよく判らないのです。
最初の"[[:alpha:]]+://"は良いとして、"[^<>[:space:]]+"は"<"や">"や"space"以外の文字列の一回以上の繰り返し、と言う意味でしょうか?
であれば、後ろの"[[:alnum:]/]"(英数とスラッシュ)は必要ないと思うのですが。
それともう一点、サンプルではリンクテキストを"\\0"(つまりURL全体)としていますが、これだとパラメータを埋め込んだURLなどの場合、長くなりすぎます。
そこで、URLの冒頭部分(例えば"?"以前とか最初の"/"までとか)だけをリンクテキストにするには、どう書けば良いでしょうか?
今回は、イマイチよく判らない正規表現の問題です。
掲示板などで記事内にURLがあった場合、HTMLのリンクに置換したいので:
http://au2.php.net/manual/ja/function.ereg-replace.php
のやり方に従うとうまく行きました。
ただ”[[:alpha:]]+://[^<>[:space:]]+[[:alnum:]/]”が何故URLのパターンなのかがよく判らないのです。
最初の"[[:alpha:]]+://"は良いとして、"[^<>[:space:]]+"は"<"や">"や"space"以外の文字列の一回以上の繰り返し、と言う意味でしょうか?
であれば、後ろの"[[:alnum:]/]"(英数とスラッシュ)は必要ないと思うのですが。
それともう一点、サンプルではリンクテキストを"\\0"(つまりURL全体)としていますが、これだとパラメータを埋め込んだURLなどの場合、長くなりすぎます。
そこで、URLの冒頭部分(例えば"?"以前とか最初の"/"までとか)だけをリンクテキストにするには、どう書けば良いでしょうか?
[3884] Re.正規表現でURLを置換したい
user: ach | created: 2007-08-30 17:10
久しぶりの書き込みです
> それともう一点、サンプルではリンクテキストを"\\0"(つまりURL全体)としていますが、これだとパラメータを埋め込んだURLなどの場合、長くなりすぎます。
> そこで、URLの冒頭部分(例えば"?"以前とか最初の"/"までとか)だけをリンクテキストにするには、どう書けば良いでしょうか?
([[:alpha:]]+://[^<>[:space:]]+[[:alnum:]/])\?[^<>[:space:]]+[[:alnum:]/]
([[:alpha:]]+://[[:alnum:]\.]+)/[^<>[:space:]]+[[:alnum:]/]
とかかな?
二行目のは"\."じゃなくて"."かも.
#PCREの方が複雑なマッチングできます.
#(というかPerlから入ったのでPCREが得意なだけ……POSIX拡張はよく分からない)
> それともう一点、サンプルではリンクテキストを"\\0"(つまりURL全体)としていますが、これだとパラメータを埋め込んだURLなどの場合、長くなりすぎます。
> そこで、URLの冒頭部分(例えば"?"以前とか最初の"/"までとか)だけをリンクテキストにするには、どう書けば良いでしょうか?
([[:alpha:]]+://[^<>[:space:]]+[[:alnum:]/])\?[^<>[:space:]]+[[:alnum:]/]
([[:alpha:]]+://[[:alnum:]\.]+)/[^<>[:space:]]+[[:alnum:]/]
とかかな?
二行目のは"\."じゃなくて"."かも.
#PCREの方が複雑なマッチングできます.
#(というかPerlから入ったのでPCREが得意なだけ……POSIX拡張はよく分からない)
[3885] Re2:正規表現でURLを置換したい
user: 江戸川アダモ | created: 2007-08-30 20:25
achさん。ありがとうございます。
貴方のサンプルを試してみました。
最初のは"?"のついたURLしかマッチしないようです。
"?"がついていると上手くいきますが。
2番目のは、http://以降の"/"が一回だけのURL(例:http://www.sound-uz.jp/)だとマッチしませんでした。
それ以外のパターンだと上手くいくようです。
でも、考え方としてはリンクテキストとして表示したい部分と、表示しない部分を分けて書くということですよね。
確かにPerlの正規表現を使ってる人もちょくちょくいますね。
preg_match('/^(https?|ftp)(:\/\/[-_.!~*\'()a-zA-Z0-9;\/?:\@&=+\$,%#]+)$/', $text))
とか。でも私は上のサンプルの方が判りやすいです。
貴方のサンプルを試してみました。
最初のは"?"のついたURLしかマッチしないようです。
"?"がついていると上手くいきますが。
2番目のは、http://以降の"/"が一回だけのURL(例:http://www.sound-uz.jp/)だとマッチしませんでした。
それ以外のパターンだと上手くいくようです。
でも、考え方としてはリンクテキストとして表示したい部分と、表示しない部分を分けて書くということですよね。
確かにPerlの正規表現を使ってる人もちょくちょくいますね。
preg_match('/^(https?|ftp)(:\/\/[-_.!~*\'()a-zA-Z0-9;\/?:\@&=+\$,%#]+)$/', $text))
とか。でも私は上のサンプルの方が判りやすいです。
[3886] Re.正規表現でURLを置換したい
user: 箱 | created: 2007-08-30 22:11
江戸川アダモさん、こんにちは。
まず、
の最後に [[:alnum:]/] があるのは、
「URLには始めの“//”とは別に必ず一度は“/”が含まれるはずである」
という解釈だと思います。
つまり、
“http://hoge.co.jp/”はOKだけど、
“http://hoge.co.jp”はNGであるという解釈です。
ですから、上記の正規表現ではスラッシュを省略した記載方法
(“http://yahoo.co.jp”とか)だとマッチしないはずなので、掲示板で
置換するにはあまり適切ではないように思います。
(一般のユーザーさんの中には“http://yahoo.co.jp”って感じで書く人も
いるでしょうから)
あと、
> そこで、URLの冒頭部分(例えば"?"以前とか最初の"/"までとか)
> だけをリンクテキストにするには、どう書けば良いでしょうか?
については、
▼GETパラメータを無視したいなら…
▼ドメイン名までにしたいなら…
でいけそうな気がします。
--------------------
#上記で「http」が全角だったりしてますが、気にしないで下さい(笑)
まず、
[[:alpha:]]+://[^<>[:space:]]+[[:alnum:]/]
の最後に [[:alnum:]/] があるのは、
「URLには始めの“//”とは別に必ず一度は“/”が含まれるはずである」
という解釈だと思います。
つまり、
“http://hoge.co.jp/”はOKだけど、
“http://hoge.co.jp”はNGであるという解釈です。
ですから、上記の正規表現ではスラッシュを省略した記載方法
(“http://yahoo.co.jp”とか)だとマッチしないはずなので、掲示板で
置換するにはあまり適切ではないように思います。
(一般のユーザーさんの中には“http://yahoo.co.jp”って感じで書く人も
いるでしょうから)
あと、
> そこで、URLの冒頭部分(例えば"?"以前とか最初の"/"までとか)
> だけをリンクテキストにするには、どう書けば良いでしょうか?
については、
▼GETパラメータを無視したいなら…
[[:alpha:]]+://[^<>[:space:]\?]+
▼ドメイン名までにしたいなら…
[[:alpha:]]+://[^<>[:space:]/]+/?
でいけそうな気がします。
--------------------
#上記で「http」が全角だったりしてますが、気にしないで下さい(笑)
[3888] Re.正規表現でURLを置換したい
user: 江戸川アダモ | created: 2007-08-30 23:20
箱さん。解説ありがとうございます。
> [[:alnum:]/] があるのは「URLには始めの“//”とは別に必ず一度は“/”が含まれるはずである」
> という解釈だと思います。
> つまり、
> “http://hoge.co.jp/”はOKだけど、
> “http://hoge.co.jp”はNGであるという解釈です。
なるほど、それじゃあ [[:alnum:]/]は無いほうが良いですね。
> ▼GETパラメータを無視したいなら…
>
> ▼ドメイン名までにしたいなら…
すみません。これだと"?"や"/"より前の部分しかマッチング出来ないですよね。
そうではなくて、マッチング自体はGETパラメータを含めたURL全てを対象にして、リンク先もそのURLに飛ぶようにしたいのです。ただ、リンクテキストだけは短くしたいということです。
ですので、正規表現のなかのどこかを()で括って、
みたいな感じになると思います。
> [[:alnum:]/] があるのは「URLには始めの“//”とは別に必ず一度は“/”が含まれるはずである」
> という解釈だと思います。
> つまり、
> “http://hoge.co.jp/”はOKだけど、
> “http://hoge.co.jp”はNGであるという解釈です。
なるほど、それじゃあ [[:alnum:]/]は無いほうが良いですね。
> ▼GETパラメータを無視したいなら…
[[:alpha:]]+://[^<>[:space:]\?]+
>
> ▼ドメイン名までにしたいなら…
[[:alpha:]]+://[^<>[:space:]/]+/?
すみません。これだと"?"や"/"より前の部分しかマッチング出来ないですよね。
そうではなくて、マッチング自体はGETパラメータを含めたURL全てを対象にして、リンク先もそのURLに飛ぶようにしたいのです。ただ、リンクテキストだけは短くしたいということです。
ですので、正規表現のなかのどこかを()で括って、
<a href=\"\\0\">\\1</a>
みたいな感じになると思います。
[3889] 自己回答?!
user: 江戸川アダモ | created: 2007-08-30 23:38
箱さんのサンプルを改造して、
としたら、出来てるみたいです。
あまりスマートな表現じゃないかもしれませんが。
([[:alpha:]]+://[^<>[:space:]\?]+)[?]*[^<>[:space:]]+
としたら、出来てるみたいです。
あまりスマートな表現じゃないかもしれませんが。