- ベストアンサー
フォームから投稿されたURLのリンクについて
掲示板などのフォームから投稿された際のURLをリンクする方法について質問があります。 (1)<a href=http://www.yahoo.co.jp>ヤフー</a>と投稿された場合はそのまま表示 (2)http://www.yahoo.co.jpと投稿された場合は、<a href=http://www.yahoo.co.jp>ヤフー</a>と自動変換するように、他のサイトを参考に$koment=~ s/(https?)\:\/\/([\w|\:\!\#-\&\*-\/\:\;\=\?\@\[-\`\{-\~]+?)/<a href=$1\:$2>$1\:$2<\/a>/ig;としました。 しかし、(1)と投稿された場合も(2)の$koment=~ s/(https?)\:\/\/([\w|\:\!\#-\&\*-\/\:\;\=\?\@\[-\`\{-\~]+?)/<a href=$1\:$2>$1\:$2<\/a>/ig;が有効な為、(1)のhttp://www.yahoo.co.jpの部分が変更されてしまいます。 (1)の場合はそのままで、(2)の場合だけ自動的に変更するようにするにはどのようにしたらいいでしょうか? 色々考えてみたのですが、うまくいかないので、どなたかお願いします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
入力に条件がありますけどとりあえずの例として。 use strict; use warnings; while (<DATA>) { s{ (?<!<a \s href=) ( ["'] ) ( https?:// [^"']+ ) ( ["'] ) } {<a href=$1$2$3</a>}xig; print; } __END__ "http://www.yahoo.co.jp" "http://www.yahoo.co.jp" "http://www.yahoo.co.jp" "http://www.yahoo.co.jp" "http://www.yahoo.co.jp" <a href="http://www.yahoo.co.jp"</a> "http://www.yahoo.co.jp"
その他の回答 (2)
- g_p_
- ベストアンサー率53% (28/52)
こんにちは#1です。 ごめんなさい、私の知識では、 ここはマッチしないけど、ここはマッチするって言う正規表は書けません。 私がとやかく言う立場ではないかも知れませんが… >基本的にタグは無効になるようにしております。 >ただ、リンクタグのみ有効にしている状況です。 これがユーザーにとって良いインターフェイスなのか 疑問が残ります。しつこいですか? >基本的にタグは無効になるようにしております。 >ただ、リンクタグのみ有効にしている状況です。 この時点で、私よりまともな正規表現が書ける気がするので わたしからソースは出せませんが(正規表現は(も?)不得意です。すみません)、 以下のようにしてみてはどうでしょう? 入力された内容をサニタイズして、その後 フォームの内容のアンカータグ全体を一度 入力不可能(サニタイズによりそういった文字があると思います。)な文字列と番号を組み合わせた文字列に置換。 なおかつアンカータグ全体をバッファリング。 URLをアンカータグに変換して、その後、ご自信で置換した文字列を再度、 バッファリングしておいたアンカータグに置換する。 1行では無理でしょうが、何とかやれそうな…(検証はしてません) もしくは、正解には程遠いと思いますが、使用されている正規表現の先頭に [^"']+ をつければ、とりあえず、URLの前に”か’が無い事が保障されるでしょう。 他の方の回答を待った方が良いでしょう。 よい回答をくれるかもです。 中途半端に口出ししてすみませんでした。 失礼します。
- g_p_
- ベストアンサー率53% (28/52)
こんにちは、 フォームにタグをかきこまれたら、そのままで、 URLを入力されたらアンカーを張るって事ですかね? もしそうなら、止めといた方がよくないですか? まず、フォームからのタグ入力は全て禁止するのが定石だと思います。 ですから、内容のタグを全て無効(いわゆるサニタイズ)にした上で、 URLらしき文字列をアンカーに変換する。ってした方が良いと思います。 そうすれば、解決しませんか? 参考までに。
補足
ありがとうございます。基本的にタグは無効になるようにしております。 ただ、リンクタグのみ有効にしている状況です。 投稿に<a href=http://www.yahoo.co.jp>ヤフー</a>http://www.yahoo.co.jpと投稿があった場合、(2)で使用している$koment=~ s/(https?)\:\/\/([\w|\:\!\#-\&\*-\/\:\;\=\?\@\[-\`\{-\~]+?)/<a href=$1\:$2>$1\:$2<\/a>/ig;がリンクタグのhttp://www.yahoo.co.jpとその他のhttp://www.yahoo.co.jpの両方に適用してしまい、ダブってしまいます。 リンクタグではないhttp://www.yahoo.co.jpだけを抽出し、$koment=~ s/(https?)\:\/\/([\w|\:\!\#-\&\*-\/\:\;\=\?\@\[-\`\{-\~]+?)/<a href=$1\:$2>$1\:$2<\/a>/ig;を利用したいと考えております。 抽出する方法ってないでしょうか?