Связать текст HTML с Дарт - PullRequest
0 голосов
/ 31 мая 2019

Я пытаюсь связать HTML-код с помощью Dart / Flutter и получить тот же результат, что и функция Javascript, которую я уже использую.

Важно отметить, что полученный текст может быть смесью простого текста и HTML.

В основном я хотел бы преобразовать это:

<h1>Hello</h1>
Visit this link: http://www.link1.com<br />

And <strong>this</strong>: 
<a href="http://www.link2.com">http://www.link2.com</a>

В это:

<h1>Hello</h1>
Visit this link: <a href="http://www.link1.com">http://www.link1.com</a><br />

And <strong>this</strong>: 
<a href="http://www.link2.com">http://www.link2.com</a>

Я пробовал этот плагин, но он работает только с простым текстом: https://github.com/blossom/linkify-dart

Приведенный ниже код JavaScript работает точно так же, как и ожидалось

function linkify(text) {
        var url_pattern = /(\()((?:ht|f)tps?:\/\/[a-z0-9\-._~!$&'()*+,;=:\/?#[\]@%]+)(\))|(\[)((?:ht|f)tps?:\/\/[a-z0-9\-._~!$&'()*+,;=:\/?#[\]@%]+)(\])|(\{)((?:ht|f)tps?:\/\/[a-z0-9\-._~!$&'()*+,;=:\/?#[\]@%]+)(\})|(<|&(?:lt|#60|#x3c);)((?:ht|f)tps?:\/\/[a-z0-9\-._~!$&'()*+,;=:\/?#[\]@%]+)(>|&(?:gt|#62|#x3e);)|((?:^|[^=\s'"\]])\s*['"]?|[^=\s]\s+)(\b(?:ht|f)tps?:\/\/[a-z0-9\-._~!$'()*+,;=:\/?#[\]@%]+(?:(?!&(?:gt|#0*62|#x0*3e);|&(?:amp|apos|quot|#0*3[49]|#x0*2[27]);[.!&',:?;]?(?:[^a-z0-9\-._~!$&'()*+,;=:\/?#[\]@%]|$))&[a-z0-9\-._~!$'()*+,;=:\/?#[\]@%]*)*[a-z0-9\-_~$()*+=\/#[\]@%])/img;
        var url_replace = '$1$4$7$10$13<a href="$2$5$8$11$14" target="_blank">$2$5$8$11$14</a>$3$6$9$12';
        return text.replace(url_pattern, url_replace);
    }

    function _linkify_html_callback(m0, m1, m2) {
        if (m2) {
            return m2;
        }
        return linkify(m1);
    }

    /**
     * Original from https://github.com/jmrware/LinkifyURL
     */
    function linkifyHtm() {
        var text = this.replace(/&amp;apos;/g, '&#39;');
        var section_html_pattern = /([^<]+(?:(?!<a\b)<[^<]*)*|(?:(?!<a\b)<[^<]*)+)|(<a\b[^>]*>[^<]*(?:(?!<\/a\b)<[^<]*)*<\/a\s*>)/ig;
        return text.replace(section_html_pattern, _linkify_html_callback);
    };

Ответы [ 2 ]

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

Спасибо Эмме за помощь. Текущее решение моей проблемы таково:

_str = _str.replaceAllMapped(
      new RegExp(r'(>|\s)+(https?.+?)(<|\s)',
             multiLine: true, caseSensitive: false), (match) {
      return '${match.group(1)}<a href="${match.group(2)}">${match.group(2)}</a>${match.group(3)}';
    }
);

Есть несколько проблем, которые могут все еще появляться (такие символы, как &, =,? В URL и т. Д.). Но этого пока достаточно

1 голос
/ 31 мая 2019

Здесь у нас сложное выражение, которое мы могли бы начать со списка ограничений до и того же после URL-адресов и, возможно, добавить их в класс char. Например, мы можем начать с выражения, такого как:

\s+(https?.+?)(<|\s)

, который (https?.+?) будет захватывать наши URL, до этого мы добавим, например, границу \s+, затем после мы добавим (<|\s). Затем мы будем работать над этими двумя левыми и правыми границами для других случаев, которые у нас могут быть.

DEMO

Тест

const regex = /\s+(https?.+?)(<|\s)/gm;
const str = `<h1>Hello</h1>
Visit this link: http://www.link1.com<br />
Visit this link: http://www.link1.com <br />
Visit this link: http://www.link1.com/some_other_words <br />
And <strong>this</strong>: 
<a href="http://www.link2.com">http://www.link2.com</a>`;
const subst = ` <a href="$1">$1</a>$2`;

// The substituted value will be contained in the result variable
const result = str.replace(regex, subst);

console.log(result);

RegEx

Если это выражение нежелательно, его можно изменить / изменить в regex101.com .

RegEx Circuit

jex.im визуализирует регулярные выражения:

enter image description here

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