Javascript регулярное выражение анализирует сложную строку URL - PullRequest
0 голосов
/ 10 января 2020

Мне нужно разобрать сложную строку URL-адреса, чтобы получить указанные c значения.

Из следующей строки URL-адреса:

/api/rss/feeds?url=http://any-feed-url-a.com?filter=hot&format=rss&url=http://any-feed-url-b.com?filter=rising&format=rss

Мне нужно извлечь этот результат в формате массива:

['http://any-feed-url-a.com?filter=hot&format=rss', 'http://any-feed-url-b.com?filter=rising&format=rss']

Я уже пытался с этим /url=([^&]+)/, но я не могу правильно все параметры запроса собрать. И я хотел бы опустить url=.

RegExr ссылку

Заранее спасибо.

Ответы [ 4 ]

0 голосов
/ 10 января 2020

Вы можете сопоставить все URL, а затем сопоставить группу захвата 1 с массивом.

str = '/api/rss/feeds?url=http://any-feed-url-a.com?filter=hot&format=rss&url=http://any-feed-url-b.com?filter=rising&format=rss'

arr = [...str.matchAll(/url=(.*?)(?=&url=|$)/g)].map(x => x[1])

console.log(arr)

Но matchAll не поддерживается старыми браузерами.
Но работает цикл exec для заполнения массива.

str = '/api/rss/feeds?url=http://any-feed-url-a.com?filter=hot&format=rss&url=http://any-feed-url-b.com?filter=rising&format=rss'

re = /url=(.*?)(?=&url=|$)/g;
arr = [];
while (m = re.exec(str)) { 
arr.push(m[1]);
}

console.log(arr)
0 голосов
/ 10 января 2020

Вы пытались использовать метод split? вместо использования регулярных выражений.

const urlsArr = "/api/rss/feeds?url=http://any-feed-url-a.com?filter=hot&format=rss&url=http://any-feed-url-b.com?filter=rising&format=rss".split("url=");
    urlsArr.shift(); // removing first item from array -> "/api/rss/feeds?"
console.log(urlsArr)

)

, который будет возвращать ["/api/rss/feeds?", "http://any-feed-url-a.com?filter=hot&format=rss&", "http://any-feed-url-b.com?filter=rising&format=rss"], затем я сбрасываю первый элемент в массиве

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

0 голосов
/ 10 января 2020

Это регулярное выражение работает для меня: url=([a-z:/.?=-]+&[a-z=]+)

также, вы можете проверить это: /http(s)?://([a-z-.?=&])+&/g

Example

const string = '/api/rss/feeds?url=http://any-feed-url.com?filter=hot&format=rss&url=http://any-feed-url.com?filter=latest&format=rss'

const string2 = '/api/rss/feeds?url=http://any-feed-url.com?filter=hot&format=rss&next=parm&url=http://any-feed-url.com?filter=latest&format=rss'

const regex = /url=([a-z:/.?=-]+&[a-z=]+)/g;
const regex2 = /http(s)?:\/\/([a-z-.?=&])+&/g;

console.log(string.match(regex))
console.log(string2.match(regex2))
0 голосов
/ 10 января 2020

Если ваш вклад в реальности сформирован лучше, чем показано в вопросе, и вы ориентируетесь на современную среду JavaScript, есть URL / URLSearchParams:

const input = '/api/rss/feeds?url=http://any-feed-url-a.com?filter=hot%26format=rss&url=http://any-feed-url-b.com?filter=rising%26format=rss';
const url = new URL(input, 'http://example.com/');

console.log(url.searchParams.getAll('url'));

Обратите внимание, что & необходимо экранировать как %26, чтобы это имело смысл.

Без этого ввода в стандартной форме это не очистить, какие правила URL-адресов еще находятся на столе.

...