スレッド表示 | フラット表示〕 全トピック 920 件中 92 番目 次≫ ≪前

正規表現で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の冒頭部分(例えば"?"以前とか最初の"/"までとか)だけをリンクテキストにするには、どう書けば良いでしょうか?
reply: 3884 3886 返信 編集 削除

[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拡張はよく分からない)
Parent: 3883  reply: 3885 返信 編集 削除

[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))
とか。でも私は上のサンプルの方が判りやすいです。
Parent: 3884  返信 編集 削除

[3886] Re.正規表現でURLを置換したい

user: | created: 2007-08-30 22:11
江戸川アダモさん、こんにちは。

まず、
[[: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」が全角だったりしてますが、気にしないで下さい(笑)
Parent: 3883  reply: 3888 3889 返信 編集 削除

[3888] Re.正規表現でURLを置換したい

user: 江戸川アダモ | created: 2007-08-30 23:20
箱さん。解説ありがとうございます。

> [[: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>

みたいな感じになると思います。
Parent: 3886  返信 編集 削除

[3889] 自己回答?!

user: 江戸川アダモ | created: 2007-08-30 23:38
箱さんのサンプルを改造して、
([[:alpha:]]+://[^<>[:space:]\?]+)[?]*[^<>[:space:]]+

としたら、出来てるみたいです。
あまりスマートな表現じゃないかもしれませんが。
Parent: 3886  返信 編集 削除
スレッド表示 | フラット表示〕 全トピック 920 件中 92 番目 次≫ ≪前
ページの一番上へ
Googleグックマークに登録 Yahooグックマークに登録 livedoorクリップに登録 @niftyクリップに登録 はてなブックマークに登録 deliciousに登録 Buzzurlに登録 FC2ブックマークに登録
最近更新された掲示板トピックス
管理人Blog
Yahoo Search

最近更新したNote
PHPマニュアル
今日のブックマーク
PHPマニュアル関数検索
関数名を入力し検索ボタンをクリック↑