Контекст

Я новичок в regex (все еще практикую), и я пытаюсь извлечь значения script src или link href из тегов (в образовательных целях).

Учитывая следующий HTML

<!-- hello -->
    <script src="1.js"></script>
    <script src="2.js"></script>
    <link rel="stylesheet" href="3.css"/>
<!-- world -->

Я бы хотел получить

Массив: 1.js, 2.js и 3.css

Я пробовал

Это регулярное выражение, которое я сделал до сих пор, но ме.

/(?:<!-- hello -->\s*?)([\s\S]*?)(?:\s?<!-- world -->)/gmi

Конечно, я должен заменить [\s\S]*? чем-то лучшим, но я перепробовал много комбинаций, и ни одна из них не сработала.

С уважением.

Обновить

Только сценарии между тегами <!-- xxx --><!-- xxx--> должны быть сопоставлены.

Следующее не должно совпадать:

<!-- foo-->
    <script src="4.js"></script>
    <script src="5.js"></script>
    <link rel="stylesheet" href="6.css"/>
<!-- bar-->
1
Nika 28 Авг 2017 в 10:45

3 ответа

Лучший ответ

Использовать регулярное выражение

<!-- hello -->([\S\s]+)<!-- world -->

Чтобы извлечь действительную строку в первой группе, см. демонстрационную версию regex

Тогда вы можете использовать регулярное выражение

<(?:script src.*|link.*href)="(\w+\.\w+)

Все матчи будут в группе 1

См. демонстрационную версию regex

1
Nika 28 Авг 2017 в 08:19

Если у вас есть такой элемент, как

<name attribute=value attribute="value" attribute='value'>

Это регулярное выражение может быть использовано для последовательного поиска каждого имени и значения атрибута

(\S+)=["']?((?:.(?!["']?\s+(?:\S+)=|[>"']))+.)["']?

Применяется на:

<a href=test.html class=xyz>
<a href="test.html" class="xyz">
<a href='test.html' class="xyz">

Это даст:

'href' => 'test.html'
'class' => 'xyz'
0
Mohhamad Hasham 28 Авг 2017 в 07:47

Итак, как отметил Wiktor Stribiżew, это следует делать поэтапно, поскольку в JS невозможно получить прямой результат.

Сначала вам нужно будет захватить элементы между тегами <!-- xxx --><!-- xxx -->, а затем использовать глобальный поиск по результату.

Спасибо Виктору Стрибьеву!

1
Nika 28 Авг 2017 в 08:06