- ベストアンサー
正規表現でのリンク張りの問題を解決する方法
- 正規表現でリンクを抽出する際に、リンクの部分だけを抽出する方法を教えてください。
- javascriptのコードを使用して、ツイートに含まれるリンクをHPに読み込む際に正しく表示する方法を教えてください。
- 正規表現を使用して、ツイート内のリンクをクリック可能にする方法を教えてください。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
JSファイルの、 var status = twitters[i].text.replace(/((https?|s?ftp|ssh)\:\/\/[^"\s\<\>]*[^.,;'">\:\s\<\>\)\]\!])/g, function(url) {…… ~となっている部分の /((https?|s?ftp|ssh)\:\/\/[^"\s\<\>]*[^.,;'">\:\s\<\>\)\]\!])/g, ~がURLを抽出する正規表現です。 これを解釈すると、 ・「 httpか、httpsか、sftpか、ftpか、 ssh 」から始まり、その後に続く「 . , ; ' " > : \s < > ) ] ! 」~以外の文字列の集合 ~となります。 Twitterは元々、英語圏で始まったサービスですので。そもそもアルファベット以外の文字を使う人間が居ると想定していません(笑)。ですので、2バイト文字言語圏、特に日本語とは色々と相性が悪いです。 前述の正規表現のままだと、通常は英語圏は文章に必ず「空白」を入れて単語を区切りますので。正規表現の「\s(=空白文字)」で文節の終わりを判断させています。ですので人間力で、Twitterに書き込む時に意図的に、リンク(URL)の前後に空白(半角スペースとか、もしくは改行など)を入れる様にすれば、JSファイルの方はそのままでもきちんと処理されます。 例文では、URLの末尾に改行や空白無しに、そのまま連続して日本語が続いているため。英語の文法でそのまま、日本語の部分も一文節、つまりURLの一部と見なされてしまってる訳です。 結論から言うと、今の正規表現では100%完璧に、URLとそれ以外の文字列を判別する事は出来ません。なのである程度は妥協するしかありません。 /((https?|s?ftp|ssh)\:\/\/[^"\s\<\>]*[^.,;'">\:\s\<\>\)\]\!])/g, ~この部分を… /((https?|s?ftp|ssh)\:\/\/[-_.!~*\'()a-zA-Z0-9;\/?:\@&=+\$,%#]+)/g, ~という風に変更すれば、ある程度は希望通りにリンクを抽出出来るかと思います。
お礼
ご回答ありがとうございます! >Twitterは元々、英語圏で始まったサービスですので。 >そもそもアルファベット以外の文字を使う人間が居ると想定していません(笑) そうなんですね~w 非常にわかりやすい説明で原因が明確にわかりました。 >結論から言うと、今の正規表現では100%完璧に、 >URLとそれ以外の文字列を判別する事は出来ません。 >なのである程度は妥協するしかありません。 そうなんですね。 やはりこのあたりは専門家の方でないとわからないので助かります。 >/((https?|s?ftp|ssh)\:\/\/[-_.!~*\'()a-zA-Z0-9;\/?:\@&=+\$,%#]+)/g, こちら早速組み込んでテストしてみたところ 今回の件は解消することができました。 非常に助かりました!ありがとうございました!