@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 ?
  • Вопрос задан
  • 141 просмотр
Пригласить эксперта
Ответы на вопрос 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">

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

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

Похожие вопросы