Как можно использовать регулярное выражение для поиска всех HTML-тегов?

Как правильно составить регулярное выражение для поиска всех тегов, чтобы оно корректно обрабатывало пример, представленный в <a href="https://regex101.com/r/GA6w7j/1" rel="nofollow">ссылке</a>? Я использовал регулярку вида <code class="php">"/&lt;.+?&gt;/im"</code>, однако она обнаруживает <pre><code class="html">&lt;&lt;===&lt;fgRed&gt;
&lt;/fgRed&gt;</code></pre> вместо ожидаемого <pre><code class="html">&lt;fgRed&gt;
&lt;/fgRed&gt;</code></pre>. Как можно исправить это?
  • 19 декабря 2024 г. 6:54
Ответы на вопрос 2
Регулярные выражения не являются идеальным инструментом для парсинга HTML, так как HTML имеет сложную иерархическую структуру, которая может включать вложенные теги, атрибуты и многое другое. Однако для простых случаев можно использовать регулярные выражения, с учетом определённых нюансов.

В вашем случае проблема с регулярным выражением `"/<.+?>/im"` заключена в том, что оно может захватывать не только HTML-теги, но и части текста между угловыми скобками, которые не являются тегами. Например, текст `<<===<fgRed>` может быть захвачен, поскольку регулярное выражение считает символы `<` и `>` просто как открывающую и закрывающую скобки.

Чтобы корректно обрабатывать теги, можно использовать следующее регулярное выражение:

```regex
/<([a-zA-Z][a-zA-Z0-9]*)\b[^>]*>/
```

### Объяснение:
- `/<`: Начало тега, символы `<`.
- `([a-zA-Z][a-zA-Z0-9]*)`: Имя тега. Это должно начинаться с буквы и может содержать буквы и цифры.
- `\b`: Граница слова, чтобы не захватывать теги, которые могут начинаться с буквы, но содержат другие символы сразу после.
- `[^>]*`: Все атрибуты, если есть, до закрывающей угловой скобки `>`. Это соответствует любым символам, кроме `>`, сколь угодно много раз.
- `>`: Закрывающая угловая скобка.

Это регулярное выражение должно корректно распознавать только те строки, которые представляют собой настоящие HTML-теги, игнорируя любые другие части текста, которые могут быть расположены между угловыми скобками.

### Пример использования на PHP:
Если вы используете PHP, вот пример кода, который ищет все HTML-теги в строке:

```php
$html_string = '<div><fgRed>Some content</fgRed><fgBlue>Another content</fgBlue></div>';
preg_match_all('/<([a-zA-Z][a-zA-Z0-9]*)\b[^>]*>/', $html_string, $matches);
print_r($matches[0]); // Выведет все найденные HTML-теги
```

Этот код извлечет все HTML-теги из строки `$html_string`.
/<[^<>]+>/ 
https://regex101.com/r/GA6w7j/2

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