Правильный способ сделать это - использовать DOM и xpath для нацеливания на конкретные элементы и атрибуты, которые вы пытаетесь извлечь.Однако, поскольку это домашняя работа, давайте обучим вашего инструктора.
Учитывая, что точная строка, это регулярное выражение будет работать: !<div class = "parent">(.+)</div>!s
Ключ "s
модификатор.Он преобразует символ «.
» из «чего-либо, кроме новой строки», в «что-либо, включая символ новой строки».
Однако, если пробелы были удалены вокруг =
, это сломалось бы.Если бы было больше атрибутов, оно сломалось бы.Если бы было больше имен классов, это сломалось бы.Другими словами, это худший способ иметь дело с HTML когда-либо .
Черт, если бы HTML выглядел так, он сломался бы:
<div>
<div class = "parent">
My spoon is too big!
<div>
I am a banana!
</div><!-- Matches when un-greedy -->
</div>
</div><!-- Matches when greedy -->
Почему?Потому что .+
- это то, что называется «жадным».Он будет соответствовать всему, что возможно, до следующего предложения.Это означает, что он будет соответствовать всему от div.parent до жадного комментария.Хотя это можно сделать не жадным, добавив знак вопроса (.+?
), тогда оно будет соответствовать первому возможному следующему предложению, а не последнему возможному следующему предложению.Это означает, что он будет соответствовать всему от div.parent до не жадного комментария.
Из-за проблем с вложением регулярные выражения являются очень плохим инструментом для анализа HTML.Проблемы, которые я вам здесь показал, касаются только поверхности h̨̜̜̟̬̭͍̀o̶̻̹̲̥̻ͧ́̆͆̊̉̍r̟͓ͨ́͆ͨͅr̪̖̠̖̤̊̾ͣͦ̀o̡̬͉͈͚̙͙ͯ͑ͨ͒ͥͩ̇ȓ̵̥̙͈̟͂̃s̠̏̊̃͠ , которая вас ждет.
Пожалуйста, по возможности, используйте настоящий анализатор HTML / XML и работайте с полученным DOM.Это спасет ваше здравомыслие.