Extraiga hipervínculos y correos electrónicos del texto y realice acciones en Android (Kotlin) | de Anant Raman | Octubre de 2020

Agrega hipertexto al texto usando cadenas extensibles

A menudo nos encontramos con situaciones en las que tenemos que extraer enlaces y correos electrónicos de una cadena determinada. Recientemente enfrenté una situación similar y la manejé con REGEX y Spannable String.

Usando Regex podemos identificar la cadena del patrón dado

Escribiremos Regex para identificar el hipervínculo a la web (www.abc.com o https //: www.abc.com):

private val urlPattern: Pattern = Pattern.compile(
"(?:^|[W])((ht|f)tp(s?)://|www.)"
+ "(([w-]+.){1,}?([w-.~]+/?)*"
+ "[p{Alnum}.,%_=?&#-+()[]*[email protected]!:/{};']*)",
Pattern.CASE_INSENSITIVE or Pattern.MULTILINE or Pattern.DOTALL
)

Ahora definamos una expresión regular para identificar correos electrónicos:

private val emailPattern: Pattern = Pattern.compile(
"[a-zA-Z0-9+._%-+]{1,256}" +
"@" +
"[a-zA-Z0-9][a-zA-Z0-9-]{0,64}" +
"(" +
"." +
"[a-zA-Z0-9][a-zA-Z0-9-]{0,25}" +
")+"
)

Una vez que hayamos terminado de definir nuestra expresión regular, comencemos con nuestras funciones para extraer hipervínculos y correos electrónicos de una cadena y personalizarla.

//Function to extract hyperlinks from a given stringprivate fun getHyperLinks(s: String): List<Pair<Int, Int>> {
val urlList = mutableListOf<Pair<Int, Int>>()
val urlMatcher = urlPattern.matcher(s)
var matchStart: Int
var matchEnd: Int
while (urlMatcher.find()) {
matchStart = urlMatcher.start(1)
matchEnd = urlMatcher.end()
urlList.add(Pair(matchStart, matchEnd))
val url = s.substring(matchStart, matchEnd)
}
return urlList
}
//Function to extract emails from a given stringprivate fun getEmailLists(s: String): List<Pair<Int, Int>> {
val emailList = mutableListOf<Pair<Int, Int>>()

val emailMatcher = emailPattern.matcher(s)
while (emailMatcher.find()) {
val email = emailMatcher.group()
emailList.add(Pair(emailMatcher.start(), emailMatcher.start() + email.length))
}
return emailList
}

//Function to customise texts which are identifed as a hyperlink or an emailprivate fun customiseText(
spanStr: SpannableString,
start: Int,
end: Int
): SpannableString {
val clickSpan = object : ClickableSpan() {
override fun onClick(widget: View) {
// Write the actions you want to be performed on click of the particular hyperlink or email
}
}
}
spanStr.setSpan(clickSpan, start, end, Spannable.SPAN_INCLUSIVE_EXCLUSIVE)//Change the colour of the hyperlink or the email spanStr.setSpan(
ForegroundColorSpan(Color.BLUE),
start, end,
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE
)

return spanStr
}

Hemos terminado ahorayNuestras funciones extraen y editan una lista de hipervínculos y correos electrónicos. Ahora usaremos los métodos anteriores en nuestra cadena. Supongamos que tenemos la cadena str de la que necesitamos extraer nuestros enlaces y correos electrónicos.

val listOfUrls = getHyperLinks(str)
val listOfEmails = getEmailLists(str)
val spanPoint = SpannableString(str)
var point: SpannableString? = null
for (url in listOfUrls) {
point = customiseText(spanPoint, url.first, url.second)
}
for (email in listOfEmails) {
point = customiseText(spanPoint, email.first, email.second)
}
binding.point.movementMethod = LinkMovementMethod.getInstance()//If our string doesnot contain any hyperlink we will set out textview with original string ortherwise with our new customised string.if (point != null) {
binding.pointTv.text = point
} else {
binding.pointTv.text = str
}

Puede visitar los siguientes enlaces para obtener más detalles:

https://medium.com/androiddevelopers/spantastic-text-styling-with-spans-17b0c16b4568
https://medium.com/@jerryhanksokafor/string-manipulation-using-spannablestring-regular-expression-and-custom-textview-part1-24e4bd3eda92

Puedes contactarme en LinkedIn https://www.linkedin.com/in/anantramanindia/

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *