Задать вопрос
@denism300

Как составить регулярку?

Плагин Contact Form 7 оборачивает в теги span выводимые поля форм. На просторах нашел фильтр с регуляркой, для удаления тегов:
add_filter('wpcf7_form_elements', function ($content) {
	$content = preg_replace('/<(span).*?class="\s*(?:.*\s)?wpcf7-form-control-wrap(?:\s[^"]+)?\s*"[^\>]*>(.*)<\/\1>/i', '\2', $content);
	return $content;
});

но он не решает все проблемы, к примеру, поле чекбокса выглядит так:
<span class="wpcf7-form-control wpcf7-acceptance">
    <span class="wpcf7-list-item">
        <input type="checkbox" name="our-policy" value="1" aria-invalid="false" class="form-check-input" id="our-policy">
    </span>
</span>

Как модифицировать регулярку, чтобы она удаляла все span теги, в классе которых есть wpcf7 ?
  • Вопрос задан
  • 143 просмотра
Подписаться 1 Простой Комментировать
Помогут разобраться в теме Все курсы
  • Skillfactory
    Профессия Fullstack веб-разработчик на JavaScript и PHP
    20 месяцев
    Далее
  • Хекслет
    PHP-разработчик
    10 месяцев
    Далее
  • Нетология
    Веб-разработчик с нуля: профессия с выбором специализации
    14 месяцев
    Далее
Пригласить эксперта
Ответы на вопрос 3
@user49981
preg_replace('/((<span[^>]{0,}>)|(<\/span>))/', "", $html);
Ответ написан
1210mk2
@1210mk2
<(span).*?class="\s*(?:.*\s)?wpcf7[^\>]*>(.*)<\/\1>


тест
Ответ написан
Комментировать
@IS-Builder
~ PHP-8 & REGEXP - This is a really powerful kit ~
denism300 вложенные теги парсить регулярками довольно сложно. Но можно пойти иным путём - сперва искать внутренние span'ы, а потом проверять внешние (теоретически). На примере это будет выглядеть так:
Code
$text = '<span class="wpcf7-form-control wpcf7-acceptance">
    <span class="wpcf7-list-item">
        <input type="checkbox" name="our-policy" value="1" aria-invalid="false" class="form-check-input" id="our-policy">
    </span>
	  <span class="list-item">
        <input type="checkbox" name="our-policy" value="1" aria-invalid="false" class="form-check-input" id="our-policy">
    </span>
    <span class="wpcf7-list-item">
        <input type="checkbox" name="our-policy" value="1" aria-invalid="false" class="form-check-input" id="our-policy">
    </span>
</span>';

$patterns = [
    '~<span[^>]*wpcf7[^>]*>\s*(<input[^>]+>)\s*</span>~s',
    '~<span[^>]*wpcf7[^>]*>(.+)</span>~s'
];
$text = preg_replace($patterns, '$1', $text);

echo $text;

/*  Результат:

    <input type="checkbox" name="our-policy" value="1" aria-invalid="false" class="form-check-input" id="our-policy">
	  <span class="list-item">
        <input type="checkbox" name="our-policy" value="1" aria-invalid="false" class="form-check-input" id="our-policy">
    </span>
    <input type="checkbox" name="our-policy" value="1" aria-invalid="false" class="form-check-input" id="our-policy">

*/
Но я не даю гарантий, что этот код будет корректно удалять теги на других входных строках (возможно понадобится корректировка)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
FoodSoul Калининград
от 180 000 до 250 000 ₽
IT-Spirit Москва
от 230 000 до 320 000 ₽
от 200 000 до 290 000 ₽