Чтобы получить точное количество, вы не можете использовать сопоставление строк или регулярное выражение из-за известных проблем синтаксического анализа HTML с регулярным выражением
Также вы не можете использовать выходные данные стандартного парсера, потому что это DOM, состоящий из элементов, и вся информация о тегах, которые были в HTML, была отброшена. Конечные теги будут выведены даже для действительного HTML, и даже некоторые начальные теги (например, html, head, body, tbody) могут быть выведены. Более того, такие вещи, как алгоритм агентства по усыновлению , могут привести к тому, что в разметке HTML будет больше элементов, чем было тегов. Например, <b><i></b>x</i>
приведет к тому, что в DOM будет два i
элемента. В то же время конечные теги, которые не могут быть сопоставлены с начальными тегами, просто отбрасываются, поскольку действительно могут начинать и заканчивать теги, которые появляются в неправильном месте. (например, <caption>
не в <table>
или <legend>
не в <fieldset>
)
Единственный способ, которым я могу думать, что вы можете сделать это надежным способом, это:
Есть PHP-библиотека с открытым исходным кодом для анализа HTML, которая называется html5lib .
Там есть файл с именем Tokenizer.php
и в конце этого файла есть функция с именем emitToken
. На этом этапе парсер выполнил всю работу по выяснению всех странностей HTML HTML, а параметр $token
содержит всю информацию о том, какой тип токена был распознан, включая начальный и конечный теги.
Вы можете взять библиотеку и изменить ее так, чтобы она подсчитывала начальные и конечные маркеры тегов в этой точке, а затем выставляла эти итоги вашему коду приложения в конце процесса анализа.
¹: То есть он выяснил странности, связанные с вашей проблемой подсчета. не началось , чтобы выяснить странности конструкции дерева.