Regex ist nicht geeignet zum parsen von html. Am besten verwendest du einen HTML parser.
Bei deinem Beispiel sind die <dl
verschachtelt. Dafür bräuchtest du ein rekursives Suchmuster.
Etwas in der Art:
preg_match_all('~<dl>(?:[^<]+|<(?!/?dl\b)|(?R))*+</dl>~i',...
Bei (?R)
wird das gesamte Suchmuster wieder eingefügt. Siehe Demo auf Regex101