Если требуется решение регулярных выражений, вот протестированная функция, которая обрабатывает теги привязки по вашему запросу (с заметными оговорками, отмеченными ниже.) Регулярное выражение представлено в подробном режиме с комментариями:
function process_markup($content) {
return preg_replace(
array( // Regex patterns
'%<(?:p|ul|li)[^>]*>%i', // Open tags.
'%<\/(?:p|ul|li)[^>]*>\s*%i', // Close tags.
'% # Match A element (with no "<>" in attributes!)
<a\b # Start tag name.
[^>]+? # anything up to HREF attribute.
href\s*=\s* # HREF attribute name and "="
(["\']?) # $1: Optional quote delimiter
([^>\s]+) # $2: HREF attribute value.
(?(1)\1) # If open quote, match close quote.
[^>]*> # Remainder of start tag
(.*?) # $3: A element contents.
</a\s*> # A element end tag.
%ix'
),
array( // Replacement strings
"", # Simply strip P, UL, and LI open tags.
"\r\n", # Replace close tags with line endings.
"$2 $3" # Keep A element HREF value and contents.
), $content);
}
Я позволил себе изменить и другие регулярные выражения. Отрегулируйте при необходимости.
ПРЕДОСТЕРЕЖЕНИЯ: Это решение регулярного выражения предполагает: Все элементы A
, P
, UL
и LI
не имеют угловых скобок <>
в своих атрибутах. В начальных и конечных тегах элемента A
, P
, UL
или LI
нет ни одного элемента CDATA
, такого как элементы SCRIPT
или STYLE
, ни комментариев HTML, ни внутри других атрибутов начального тега. , В противном случае это должно работать очень хорошо для большой разметки HTML.
Я понимаю, что многие вздрагивают, когда слышат слова: HTML
и REGEX
, сказанные на одном дыхании, но в этом конкретном случае я думаю, что решение для регулярных выражений будет работать достаточно хорошо (в рамках вышеуказанных ограничений). Тег A
является одним из тех, который не является вложенным , поэтому регулярное выражение может легко сопоставить начальный тег, содержимое и конечный тег - все в одном ударе. То же самое с отдельными начальными и конечными тегами для других элементов (которые могут быть вложенными) при рассмотрении независимо.