Мы новичок в регулярном выражении (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 и затем заменить ее выводом?
Мы будем признательны за любую помощь, предложения и примеры кода заранее.
Большое спасибо.
каков ваш ожидаемый результат? вы хотите удалить только тег или также тег с внутренним содержимым? <h2>Automatic Writing– A Conduit For An Entity From Another World?</h2>
HTML и регулярное выражение не являются хорошими друзьями. Используйте парсер, это проще, быстрее и гораздо удобнее в сопровождении. См.: php.net/manual/en/class.domdocument.php
Спасибо за ваши комментарии, ребята. Я знаю, что REGEX/HTML не лучшие друзья, но мы хотим сделать это таким образом. Входная строка всегда в одном и том же формате, поэтому она работает для нас.
@Curious_Mind - спасибо за ответ. Мы бы хотели, чтобы тег выглядел как <h2>Automatic Writing – A Conduit For An Entity From Another World?</h2> — мы хотим сохранить внутренний текст и просто удалить теги.
Спасибо @WiktorStribiżew. Мы немного изменили его, чтобы он соответствовал всем тегам заголовков: $content = preg_replace_callback('~<h[1-6]>.*?</h[1-6]>~s', function($m) { return preg_replace('~</?strong>~i', '', $m[0]); }, $content);
Может ли кто-нибудь помочь мне взглянуть на мою тему тоже. Посещение: stackoverflow.com/questions/62502118/…






Вы можете использовать
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].
Лучше посмотрите на запросы
xpath(DomDocumentи подобные).