@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">

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

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

Войти через центр авторизации
Похожие вопросы