Соответствие всем <strong>тегам в preg_replace - PullRequest
0 голосов
/ 08 февраля 2019

Мы новички в regex (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 и затем заменить на вывод?

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

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

1 Ответ

0 голосов
/ 08 февраля 2019

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

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'

См. PHPdemo .

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