• ベストアンサー

フォームから投稿された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)の場合だけ自動的に変更するようにするにはどのようにしたらいいでしょうか? 色々考えてみたのですが、うまくいかないので、どなたかお願いします。

  • hana43
  • お礼率49% (105/212)
  • Perl
  • 回答数3
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.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)
回答No.2

こんにちは#1です。 ごめんなさい、私の知識では、 ここはマッチしないけど、ここはマッチするって言う正規表は書けません。 私がとやかく言う立場ではないかも知れませんが… >基本的にタグは無効になるようにしております。 >ただ、リンクタグのみ有効にしている状況です。 これがユーザーにとって良いインターフェイスなのか 疑問が残ります。しつこいですか? >基本的にタグは無効になるようにしております。 >ただ、リンクタグのみ有効にしている状況です。 この時点で、私よりまともな正規表現が書ける気がするので わたしからソースは出せませんが(正規表現は(も?)不得意です。すみません)、 以下のようにしてみてはどうでしょう? 入力された内容をサニタイズして、その後 フォームの内容のアンカータグ全体を一度 入力不可能(サニタイズによりそういった文字があると思います。)な文字列と番号を組み合わせた文字列に置換。 なおかつアンカータグ全体をバッファリング。 URLをアンカータグに変換して、その後、ご自信で置換した文字列を再度、 バッファリングしておいたアンカータグに置換する。 1行では無理でしょうが、何とかやれそうな…(検証はしてません) もしくは、正解には程遠いと思いますが、使用されている正規表現の先頭に [^"']+ をつければ、とりあえず、URLの前に”か’が無い事が保障されるでしょう。 他の方の回答を待った方が良いでしょう。 よい回答をくれるかもです。 中途半端に口出ししてすみませんでした。 失礼します。

  • g_p_
  • ベストアンサー率53% (28/52)
回答No.1

こんにちは、 フォームにタグをかきこまれたら、そのままで、 URLを入力されたらアンカーを張るって事ですかね? もしそうなら、止めといた方がよくないですか? まず、フォームからのタグ入力は全て禁止するのが定石だと思います。 ですから、内容のタグを全て無効(いわゆるサニタイズ)にした上で、 URLらしき文字列をアンカーに変換する。ってした方が良いと思います。 そうすれば、解決しませんか? 参考までに。

hana43
質問者

補足

ありがとうございます。基本的にタグは無効になるようにしております。 ただ、リンクタグのみ有効にしている状況です。 投稿に<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;を利用したいと考えております。 抽出する方法ってないでしょうか?

関連するQ&A

  • perlの自動リンクについてです。

    URLのオートリンクで、どうしても解らない箇所があります。 $com =~s/([^=^\"]|^)(http\:[\w\.\~\-\/\?\&\+\=\:\@\%\;\#]+)/$1<a href=\"$2\" \">$2<\/a>/g; たとえば、$comに   "自動リンクhttp://okwave.jp/question/new?questionてすと" と入っていたらこの$1にはなにが入るのですか? $2はなんとか理解できたのですが、、 ([^=^\"]|^)  これは何をしているのですか??

  • リンクを押すとフォームを送信

    リンクを押すとフォームを送信したいので、 <a href="JavaScript:document.form1.submit()"・・・ というふうに、書いたのですが、 リンクのみだとちゃんと動くのですが、 同一フォーム内にボタンとリンクが混在するとJavaScriptエラーが発生してしまします。どうしたらいいでしょうか?

    • ベストアンサー
    • HTML
  • 正規表現(urlをリンクさせる)

    $comment = "http://www.yahoo.co.jpとhttp://www.google.co.jp/"; $comment =~ s/(http\:\/\/[a-zA-Z0-9\.\$\,\;\:\&\=\?\!\*\~\@\#\_\(\)\%\+\-\/]*)/<a href=\1>\1<\/a>/mg; 上の文字列では下記の様に置換されるのですが問題ないのですが <a href=http://www.yahoo.co.jp>http://www.yahoo.co.jp</a>と<a href=http://www.google.co.jp/>http://www.google.co.jp/</a> コメントが  $comment ="http://www.yahoo.co.jp&lt;br&gt;http://www.google.co.jp/"; だと <a href=http://www.yahoo.co.jp&lt;br&gt;http://www.google.co.jp/>http://www.yahoo.co.jp&lt;br&gt;http://www.google.co.jp/</a> のように置換されてしまいます。 下記の様に置換する正規表現を教えてください。 <a href=htt://http://www.yahoo.co.jp>http://www.yahoo.co.jp</a>&lt;br&gt;<a href=http://www.google.co.jp/>http://www.google.co.jp/</a>

    • ベストアンサー
    • Perl
  • 文章からhttp:を探し出し自動リンクをつけたい

    perlマスターな方に質問です(ちょっと高レベルです)。 テキストの中から、http:~の部分を抜き出してリンクを 付ける関数を、WEBページを参考に(というかまんま)作って動作したのですが、それを再編集するとおかしなことになり困ってます。 文章では分かりにくいので実例で説明しますと… ○○のページのリンク http://www.tatoeba.com という文章があります。 それを関数にかけるとちゃんと ○○のページのリンク <a href="http://www.tatoeba.com"> http://www.tatoeba.com </a> となります。が、この文章を修正して再登録する と、またhttp部分を探してしまい、結果的に ○○のページのリンク <a href="<a href="http://www.tatoeba.com">http://www.tatoeba.com</a></a>"> <a href="http://www.tatoeba.com">http://www.tatoeba.com</a></a> のように分けの分からない文章になってしまいます。 これを回避したいのですがどうしたら良いでしょうか? 具体的には、「http」を見つけたとき、以下の2つの文字のときは自動リンク処理を回避すれば大丈夫だと思います。 >http "http 関数のソースは以下のようになってます。 $str =~ s/([^=^\"]|^)(http\:[\w\.\~\-\/\?\&\=\@\;\#\:\%]+)/$1<a href=\"$2\" target='_top'>$2<\/a>/g; このソースをどう変更したらそんな素晴らしい処理が可能になるでしょうか?分かる方は…いらっしゃいますでしょうか?(ドキドキ)。もしそんな神懸りな正規表現マスター様がいらっしゃいましたら、どうかご教授ください。

    • ベストアンサー
    • Perl
  • JqueryでリンクURLの変更

    JqueryでリンクURLの変更をしたいと思います。 内容は、 <a href="hogehohe.html"></a> このようなリンクに <a href="hogehohe.html#content"></a> このように後ろに#contentをJqueryで追加したいと思います。 例えば#sidebar内のaタグ全てのリンク先に#contentを追加する事は可能でしょうか? ご教授御願します。

  • フォームのリンクについて

    nyuryoku.php <form method="POST" action="kakunin.php"> <p> </p> <p><a href="変更フォーム"><img border="0" src="henkou.gif"></a><a href="会社フォーム"><img border="0" src="kaisya.gif"></a></p> <p>変更フォーム</p> <p>名前<input type="text" name="T1" size="20"></p> <p>住所<input type="text" name="T2" size="20"></p> <p>TEL<input type="text" name="T3" size="20"></p>  <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <p>会社フォーム</p> <p>会社名<input type="text" name="T4" size="20"></p> <p>会社住所<input type="text" name="T5" size="20"></p> <p>会社TEL<input type="text" name="T6" size="20"></p> <p> </p> <p><input type="submit" value="送信" name="B1"><input type="reset" value="リセット" name="B2"></p> </form> <form>から</form>の中に変更フォームと会社フォームがあり henkou.gifをクリックすると画面上に変更フォームが現れて、kaisya.gifをクリックすると会社フォームが表れるようにしたいのです。 そして入力された情報は<input type="submit" value="送信" name="B1">で一度に送信できるようにしたいのですが、 henkou.gifとkaisya.gifにどういう風にリンクをはり各フォームだけを表示するにはどうしたらいいでしょうか?

    • ベストアンサー
    • PHP
  • リンクできません。できる方法をお教えください。

    YAHOO!グループの 「掲示板への新しいメッセージの投稿 」へ次のように書き入れました。 <A href="http://totoro.info/" target="_blank">■無料一括投稿「トトロ」</A> [プレビュ]ボタンを押したところ、上述ように書き入れたとおりの文章が表示されました。 私としては ”■無料一括投稿「トトロ」” のみを、テキストリンクとしたいのです。 つまり ”■無料一括投稿「トトロ」” をクリックすれば”■無料一括投稿「トトロ」”が表示できるできるようにしたいのです。 <A href="http://totoro.info/" target="_blank"></A> は、表示させたくありません。 以前は(前日)までは他のリンクもリンク可能でした。 アフェリエイトに使っているので、大変困っています。 宜しくご教示をお願いいたします。

  • 文字列の表示

    $fpr =~ s/&quot;/\"/g; $fpr =~ s/&amp;/\&/g; $fpr =~ s/(https?)\:([\w|\:\!\#\$\%\=\&\-\^\`\\\|\@\~\[\{\]\}\;\+\*\,\.\?\/]+)/<a href=\"$1\:$2\"target=\"_blank\">$1:$2<\/a>/ig; print "$fpr\n"; 上記のコ-ドは掲示板に表示するコ-ドです、 解説をお願いします。

    • ベストアンサー
    • CGI
  • 正規表現で自動リンク後、長いURL表示を丸めたい

    お世話になります。 PHP4で作った掲示板を運営しています。 過去ログを参考にし、以下の正規表現で投稿本文中のURLを自動リンクしています。 $text=ereg_replace("(https?|ftp|news)(://[[:alnum:]\+\$\;\?\.%,!#~*/:@&=_-]+)","<a href='\\0'>\\0</a>",$text); 今の問題は、長いURLを貼られたときに折り返しされず掲示板のレイアウトが崩れることです。 そこで<a>~</a>間の表示部分だけ規定文字数で丸めたいのですが、なかなか良い方法が思いつきません。 どなたかお知恵を貸してください。 ちなみに応急処置として、親<td>タグに style="word-break:break-all;" を入れています。 でもこれだとIE以外は効果ないので・・・。

    • ベストアンサー
    • PHP
  • アクセスでフォーム間のリンク?

     こんにちは、どなたかご助力をお願いします。  アクセス97でデーターベースを作成していて、フォームから入力できるようにしたいと思っています。  店の経営者がSさんからTさんに変わったとき、店名や店にある商品はそのままですが、経営者IDが変わるので、それを入力する必要があります。  フォームAを立ち上げて、Sさんの店を検索します。  次にコマンドボタンのクリック1つでフォームB(新規入力用、形式はフォームAと同じ)が立ち上がります。・・・ここまではできました。  そして開いたフォームBには、既にSさんの時と同じ店名や商品名が記入されていて(フォームAの商品のデータなどをそのまま反映させる)、Tさんの経営者IDだけを入力するようにしたいのですが、できないものでしょうか?  よろしくお願いします。

専門家に質問してみよう