У меня есть строка
<h1>hello/h1> <script src="http://www.test.com/file1.js"></script> <script src="http://www.test.com/file2.js"></script> <p>bye</p>
, и мне нужно сгенерировать массив с URL-адресами, найденными в строке.
['http://www.test.com/file1.js', 'http://www.test.com/file2.js']
также мне нужно заменить всю строку (включаятеги сценарий теги) с ничего.
это то, что я до сих пор, чтобы найти URL
^(<script src=")(.*)("><\/script>)$
проблема в том, что он работает только с
<script src="http://www.test.com/file1.js"></script>
если я определю свои сценарии следующим образом
<script id="something" src="http://www.test.com/file1.js"></script>
, это не сработает.
Попробуйте вместо этого использовать правильный анализатор HTML, например cheerio: найдите <script> теги, удалите их и поместите их src в массив:
<script>
src
const cheerio = require('cheerio'); const htmlStr = `<h1>hello/h1> <script src="http://www.test.com/file1.js"></script> <script src="http://www.test.com/file2.js"></script> <p>bye</p>`; const $ = cheerio.load(htmlStr); const urls = []; $('script').each((_, script) => { urls.push(script.src); $(script).remove(); }); const result = $('body').html(); console.log(result);
Используйте этот insted
^(<script )(.*)(src=")(.*)("><\/script>)$
, а 4-ые группы - это URL
или ^(?:<script )(?:.*)(?:src=")(.*)(?:"><\/script>)$ для использования групп без захвата.
^(?:<script )(?:.*)(?:src=")(.*)(?:"><\/script>)$
Этот RegEx может помочь вам получить эти URL:
^<.+="(.+)"><\/.+>$
. Он создает одну группу, в которой находятся ваши целевые URL, и фильтрует все остальное.Он также работает с тегами <a> и другими аналогичными тегами с шаблонами открытия и закрытия.
<a>
Чтобы получить только URL, вы можете сделать:
^<script.*?src="(.*)".*?><\/script>$
Это ловит случаи, когда атрибуты находятся перед и после атрибута src.