Development/Android

[Android / Kotlin] 정규 표현식으로 Text에서 url 부분 Link 처리하기

SeungYong.Lee 2025. 6. 25. 09:45
반응형

- 간혹 전체 텍스트에 url이 중간에 섞여있고, 이 부분을 링크 처리하여 사용자가 바로 외부로 연결할 수 있도록 구현이 필요할 때 아래와 같은 함수를 구성해서 사용한다.

fun setHyperlinkedText(textView: TextView, rawText: String) {
    val spannable = SpannableString(rawText)

    val urlRegex = Regex("""https?://[^\s]+""")
    val matches = urlRegex.findAll(rawText)

    for (match in matches) {
        val url = match.value
        val start = match.range.first
        val end = match.range.last + 1

        val clickableSpan = object : ClickableSpan() {
            override fun onClick(widget: View) {
                val intent = Intent(Intent.ACTION_VIEW, Uri.parse(url))
                widget.context.startActivity(intent)
            }

            override fun updateDrawState(ds: TextPaint) {
                super.updateDrawState(ds)
                ds.color = Color.BLUE
                ds.isUnderlineText = true
            }
        }

        spannable.setSpan(clickableSpan, start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
    }

    textView.text = spannable
    textView.movementMethod = LinkMovementMethod.getInstance()
    textView.highlightColor = Color.TRANSPARENT
}

 

- SpannableString을 통해 특정 Text 범위에 스타일 또는 링크 효과를 줄 준비를 한다.

 

- 정규표현식 "https?://[^\s]+"는 http:// 또는 https://로 시작하는 문자열을 인식한다.

val urlRegex = Regex("""https?://[^\s]+""")

 

- 그리고 전체 문자열을 기반으로 정규표현식에 맞는 부분을 찾아 Clickable 처리를 해준다. 여기서 UnderLine 및 링크 색상 지정이 가능

val clickableSpan = object : ClickableSpan() {
    override fun onClick(widget: View) {
        val intent = Intent(Intent.ACTION_VIEW, Uri.parse(url))
        widget.context.startActivity(intent)
    }

    override fun updateDrawState(ds: TextPaint) {
        super.updateDrawState(ds)
        ds.color = Color.BLUE
        ds.isUnderlineText = true
    }
}

 

- 이후 movementMethod를 지정하여 링크 클릭을 활성화하고, 클릭하는 순간에 배경은 따로 지정하지 않도록 해준다.

textView.text = spannable
textView.movementMethod = LinkMovementMethod.getInstance()
textView.highlightColor = Color.TRANSPARENT
반응형