2017-04-13 8 views
1

私のアプリケーションは、Stack Overflowでここと同じマークアップを持つリンクを含むことが多いAPIからコメントを読み込みます。AndroidでStackOverflowのようにマークアップをリンクするにはどうすればよいですか?

//this is the markup I am referring to 
[Here's a picture](https://www.web.com/sub/path/to/picture/?st=JHTYA46&am-p;sh=487Bac48) 

(私はそれをGoogleヘルプには、このマークアップスタイルの名前がある場合、私はコメントで知らせてください)私は

private static final String REGEX_LINK_MARKUP = "\\[(.*?)\\]\\((.*?)\\)"; 
private static final String REGEX_LINK_REPLACEMENT = "<a href=\"$2\">$1</a>"; 
commentText.setText(comment.getBody().replaceAll(REGEX_LINK_MARKUP, REGEX_LINK_REPLACEMENT))); 

android:autoLink="all" 
を使用してリンクに変換してみました

もちろんhrefの部分をクリックできるHTMLが表示されているので、現在私はリンクに変換しています

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { 
    //the constants are the same patterns from above 
    commentText.setText(Html.fromHtml(comment.getBody().replaceAll(REGEX_LINK_MARKUP, REGEX_LINK_REPLACEMENT), Html.FROM_HTML_MODE_LEGACY)); 
} else { 
    commentText.setText(Html.fromHtml(comment.getBody().replaceAll(REGEX_LINK_MARKUP, REGEX_LINK_REPLACEMENT))); 
} 

正しく色付きのスパンが表示されるようになりましたが、クリックできません。フィールドには、すでにマークアップのこのタイプを作るための正しい方法は何有意差(リンクはunclickableある)

android:autoLink="none" 
  • を行うものではありません、私はnoneまたはallに次を残すかどうか

    android:linksClickable="true" 
    

    を持っていますTextViewでクリック可能?

  • HTMLを使用せずにTextViewリンクを作成する方法はありますか?
  • 私の非常に基本的なパターンよりも効率的な正規表現がありますか?
+0

このタイプの式 '\ [(。*?)\] \((* *))\)'を使用する場合は注意してください。エスケープされたデリミタがデリミタの内部で有効である可能性があります。 – sln

+0

良いアドバイス、これは怠け者の最初の試みでした。私はコメントに基づいていました。 "fsfsg [dfsdf sdfds](...):)"のようなものに遭遇したので、怠け者のマッチングにしました –

答えて

2

これは交換してください使用しての提案と分かれています、

<a href="https://example.com">This is link text</a> 

をクリック可能なように、リンクを設定するには、次のような呼び出し

public static String getFormatted(String rawInput){//rawInput is the link. It does not find links from a bulk of text. 
    String[] content; 
    content = rawInput.split("\\]\\(");//Split the input 
    String ctnt = content[0].replaceAll("\\[", "");//remove remaining link bracket 
    String link = content[1].replaceAll("\\)", ""); 
    String format = "<a href=\"%s\">%s</a>";//The format 
    return String.format(Locale.ENGLISH, format, link, ctnt);//Format and return the link in the format of an `a`-tag 
} 

:返し

System.out.println(getFormatted("[This is link text](https://example.com)"));//System.out.println is to show it works 

あなたは単に以下を実行します(source):あなたはのTextViewで<a href"...を持つことができますし、

それがクリック可能にすることを

TextView t2 = (TextView) findViewById(R.id.text2); 
//Set text if you do that. If you do set the text in Java code, make sure 
//you add Html.fromHtml() to allow it. You may need to add <p> tags as well 
t2.setMovementMethod(LinkMovementMethod.getInstance()); 

は、HTMLを使用せずのTextViewのリンクを作成する方法は何ですか?

私が見たことによると、フルリンク(例:www.google.com)を表示せずに行うことはできません。


EDIT:

任意のテキストを取得し、それを再フォーマット、これを行うには:

String pattern = "(\\[.*\\]\\(.*\\))"; 
    Pattern p = Pattern.compile(pattern); 
    String link = "Blah blah [link](https://example.com) blah blah";//This will be replaced with your block of text 
    link.replaceAll(pattern, "%s"); 
    Matcher matcher = p.matcher(link); 
    String lnk = null; 
    if (matcher.find()){ 
     lnk = matcher.group(1); 
    } 

    System.out.println(lnk);//Debug 
    String formatted = getFormatted(lnk); 
    System.out.println(formatted);//Debug 
    link = String.format(Locale.ENGLISH, link, formatted);//This amends the formatted link into the location of the [link](in this format) 

それは、この回答の上部に提供される方法を使用しています。

これは、出力します:

[link](https://example.com)//The link extracted from the block 
<a href="https://example.com">link</a>//The formatted link 
+0

ありがとう、LinkMovementMethod ? –

+0

TextViewで ' Zoe

+0

LinkMovementMethodは、リンクをクリック可能にする必要があるものに置き換えることができます(動作するメソッドがあると仮定します)。 – Zoe

1

アカウントが区切り文字をエスケープに取らなければならない場合は、一般的な正規表現は次のようになり

\[([^\\\]]*(?:\\[\S\s][^\\\]]*)*)\]\(([^\\)]*(?:\\[\S\s][^\\)]*)*)\)

拡張

\[ 
(       # (1 start) 
     [^\\\]]* 
     (?: \\ [\S\s] [^\\\]]*)* 
)        # (1 end) 
\] 

\(
(       # (2 start) 
     [^\\)]* 
     (?: \\ [\S\s] [^\\)]*)* 
)        # (2 end) 
\) 
あなたがする必要があるかもしれません
+0

2番目のグループ(url)の空白は有効ですか? '?:'が何をするのかについての説明が大好きです。マッチした人は "空白にマッチする、空白にマッチする、空白にマッチする、何度もバックスラッシュでないものを探す"(私は正規表現のマスターではないと言うことができる) –

+0

@NickCardoso - 一種の_general_正規表現。これは、グループ2が有効な_ネスカップドクロージャー ')'が見つかるまでグループ2が一致することを意味します。有効なURLを気にしている場合は、このグループを少し変更する必要があります。または、グループ2の中でURL正規表現を使用してください。しかし、それはあなたが思うよりも悪いかもしれません。私はターゲット文字列に有効なURLがあることを願っています。この場合、あなたはあなたが持っていたもの、つまり '\((。*?)\)'を使うことができます。知っている。 – sln