Требовать http: // или https: // в начале регулярного выражения - PullRequest
1 голос
/ 20 октября 2019

Мое регулярное выражение отлично работает, за исключением того, что я хочу добавить требование, чтобы URL-адрес содержал http:// или https://, а мои попытки исправить регулярное выражение нарушают его. Любая помощь приветствуется!

    let rx = new RegExp(/((([A-Za-z]{3,9}:(?:\/\/)?)(?:[\-;:&=\+\$,\w]+@)?[A-Za-z0-9\.\-]+|(?:www\.|[\-;:&=\+\$,\w]+@)[A-Za-z0-9\.\-]+)((?:\/[\+~%\/\.\w\-_]*)?\??(?:[\-\+=&;%@\.\w_]*)#?(?:[\.\!\/\\\w]*))?)/g);
let replaced = text.replace(
        rx,
        `<a href="$1" target="_blank">$1</a>`
    ); 

1 Ответ

2 голосов
/ 20 октября 2019

Заменить [A-Za-z]{3,9}:(?:\/\/)? на https?:\/\/. И поскольку вы не используете переменные для построения регулярного выражения, используйте литерал регулярного выражения, а не нотацию конструктора.

/\bhttps?:\/\/(?:(?:[-;:&=+$,\w]+@)?[A-Za-z0-9.-]+|(?:www\.|[-;:&=+$,\w]+@)[A-Za-z0-9.-]+)(?:\/[+~%\/.\w_-]*\??(?:[-+=&;%@.\w_]*)#?[.!\/\\\w]*)?/g

См. демонстрацию онлайн-регулярного выражения

\bhttps?:\/\/, соответствующее https:// или http:// как целому слову, будет применяться к обеим альтернативам в (?:(?:[-;:&=+$,\w]+@)?[A-Za-z0-9.-]+|(?:www\.|[-;:&=+$,\w]+@)[A-Za-z0-9.-]+), (?:[-;:&=+$,\w]+@)?[A-Za-z0-9.-]+ и (?:www\.|[-;:&=+$,\w]+@)[A-Za-z0-9.-]+, что требует протокола до www..

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

let text = "https://example.com http://example.com/more?k=v ftp://not.this.one www.example www.example.com";
let rx = /\bhttps?:\/\/(?:(?:[-;:&=+$,\w]+@)?[A-Za-z0-9.-]+|(?:www\.|[-;:&=+$,\w]+@)[A-Za-z0-9.-]+)(?:\/[+~%\/.\w_-]*\??(?:[-+=&;%@.\w_]*)#?[.!\/\\\w]*)?/g;
let replaced = text.replace(rx,'<a href="$&" target="_blank">$&</a>'); 
console.log(replaced);

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

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