Соответствие всем тегам <strong> в preg_replace

Мы новичок в регулярном выражении (preg_replace) в PHP, и у нас возникли небольшие проблемы с тем, чтобы заставить его делать именно то, что мы хотим.

У нас есть, например, такой HTML-код:

<h2><strong>Automatic Writing</strong> <strong>– A Conduit For An Entity From Another World?</strong></h2>

Мы хотим удалить все теги стилей внутри H2 (и даже сопоставить теги H3/H4/H5).

На данный момент мы создали следующий код (мы интегрируемся с Wordpress):

function removebolding($content)
        {
            $content =
                preg_replace('/(<h([1-6])[^>]*>)\s?<strong>(.*)?</strong>\s?(</h\2>)/', "$1$3$4", $content);
            return $content;
        }

        add_filter('the_content', 'removebolding');

Это работает, однако удаляет только первый «сильный» тег — у нас остается:

<h2>Automatic Writing <strong>– A Conduit For An Entity From Another World?</strong></h2>

Как мы можем сопоставить/удалить все «сильные» теги? Кроме того, возможно, мы могли бы просто извлечь содержимое тегов заголовков, запустить функцию strip_tags и затем заменить ее выводом?

Мы будем признательны за любую помощь, предложения и примеры кода заранее.

Большое спасибо.

Лучше посмотрите на запросы xpath (DomDocument и подобные).

Jan 08.02.2019 16:16

каков ваш ожидаемый результат? вы хотите удалить только тег или также тег с внутренним содержимым? <h2>Automatic Writing– A Conduit For An Entity From Another World?</h2>

Always Sunny 08.02.2019 17:47

HTML и регулярное выражение не являются хорошими друзьями. Используйте парсер, это проще, быстрее и гораздо удобнее в сопровождении. См.: php.net/manual/en/class.domdocument.php

Toto 08.02.2019 17:51

Спасибо за ваши комментарии, ребята. Я знаю, что REGEX/HTML не лучшие друзья, но мы хотим сделать это таким образом. Входная строка всегда в одном и том же формате, поэтому она работает для нас.

Ted Wilmont 08.02.2019 18:20

@Curious_Mind - спасибо за ответ. Мы бы хотели, чтобы тег выглядел как <h2>Automatic Writing – A Conduit For An Entity From Another World?</h2> — мы хотим сохранить внутренний текст и просто удалить теги.

Ted Wilmont 08.02.2019 18:21

Спасибо @WiktorStribiżew. Мы немного изменили его, чтобы он соответствовал всем тегам заголовков: $content = preg_replace_callback('~<h[1-6]>.*?</h[1-6]>~s', function($m) { return preg_replace('~</?strong>~i', '', $m[0]); }, $content);

Ted Wilmont 08.02.2019 19:58

Может ли кто-нибудь помочь мне взглянуть на мою тему тоже. Посещение: stackoverflow.com/questions/62502118/…

Miracle Hades 21.06.2020 19:56
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
8
377
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете использовать

preg_replace_callback('~<h([1-6])>.*?</h\1>~is', function($m) { 
    return preg_replace('~</?strong>~i', '', $m[0]); }
, $s)

Выход: <h2>Automatic Writing – A Conduit For An Entity From Another World?</h2>

Производительность регулярных выражений может быть улучшена следующим образом:

'~<h([1-6])>[^<]*(?:<(?!/h\1>[^<]*)*</h\1>~i'

См. демонстрация PHP.

  • ~<h([1-6])>.*?</h\1>~s соответствует любым тегам h с любым текстом между ними.
  • preg_replace('~</?strong>~i', '', $m[0]) удаляет все теги <strong> и </strong> только в основном значении соответствия регулярному выражению в $m[0].

Другие вопросы по теме