Как использовать Regex для замены ссылок в Android WebView в Kotlin - PullRequest
2 голосов
/ 07 июня 2019

Я использую WebView в приложении для Android, написанном на Kotlin, для отображения некоторого расширенного текстового содержимого, которое передается через ответ API. Данные представлены в виде необработанного текста, смешанного с некоторыми компонентами HTML (ссылками), которые отображаются в приложении.

Целью написания этого фильтра Regex является сбор необработанных ссылок, не заключенных в теги <a>, и их переформатирование, чтобы они широко отображались в веб-представлении.

Мои текущие попытки решить эту проблему включают использование replace() со встроенной функцией для захвата ссылки и замены ее тегом <a>.

У меня есть переопределенная функция, которая берет данные для загрузки в WebView и добавляет некоторые данные стиля, а также удаляет любые теги <iframe>. Эти два компонента работают, однако моя замена с использованием pattern для сопоставления URL не имеет никакого эффекта.

Дан список:

http://example.com
https://example.com

Ожидаю вывод:

<a href="http://example.com">auto link</a>
<a href="https://example.com">auto link</a>

Тем не менее, мой шаблон дает неизменный ввод.

Я использую шаблон соответствия URL, найденный здесь: https://mathiasbynens.be/demo/url-regex


val pattern = "@(https?|ftp)://(-\\.)?([^\\s/?\\.#-]+\\.?)+(/[^\\s]*)?$@iS\n".toRegex()
data.replace(pattern) {
    "<a href=\"${it.groupValues[1]}\">auto link</a>"
}

Log.i("TEST", data)

Эта функция не может заменить данные правильной ссылкой, когда я ее регистрирую, хотя я знаю, что шаблон соответствует ссылкам, которые я передаю.

Ответы [ 2 ]

1 голос
/ 08 июня 2019

Вот пример кода, который будет выполнять эту работу:

var data = "http://example.com <a href=\"http://example.com\">auto link</a>"
val pattern = """(?i)<a\s+[^>]*>[^<]*</a>|(https?|ftp)://(?:-\.)?([^\s/?.#-]+\.?)+(/\S*)?""".toRegex()
    data = data.replace(pattern) {
        if (it.groupValues[1].isNullOrEmpty()) it.value else "<a href=\"${it.value}\">auto link</a>" 
    }
println(data)

Выход:

<a href="http://example.com">auto link</a> <a href="http://example.com">auto link</a>

См. Демо-версию Kotlin

Обратите внимание, что вам нужно присвоить измененное значение обратно переменной data.

Кроме того, вы используете отформатированное регулярное выражение PHP-типа, но в Kotlin не следует использовать разделители регулярных выражений. Вместо этого вы можете использовать встроенные модификаторы, например (?i), чтобы сделать регистр нечувствительным к регистру.

Сведения о регулярном выражении

  • (?i) - нечувствительный к регистру модификатор
  • <a\s+[^>]*>[^<]*</a> - шаблон тега A
  • | - или
  • (https?|ftp) - группа 1, http, https или ftp
  • :// - подстрока ://
  • (?:-\.)? - необязательная -. подстрока
  • ([^\s/?.#-]+\.?)+ - одно или несколько повторений из 1 или более символов, кроме пробелов, /, ?, ., #, -, а затем необязательная точка
  • (/\S*)? - необязательная группа, /, за которой следует 0 или более непробельных символов.

Если группа 1 соответствует, мы заменяем ссылку. В противном случае верните весь тег A обратно.

0 голосов
/ 07 июня 2019

Я уверен, что могли бы быть более эффективные способы выполнить эту задачу, но, похоже, мы также будем проверять, для чего мы начнем с простого выражения:

^(https?:\/\/[^\s]+?\.[^\s]+)$

тогда мы добавим больше ограничений, если необходимо, для проверки, и мы заменим их чем-то похожим на:

<a href="$1">auto link</a>

Демо

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...