Мне нужно заменить весь текст внутри тега (который не является кодом).
Итак, я использую:
preg_replace('/<.*?>([^<]*)<\/.*?>/', "new_text", $str)
И я получаю результат. Но мне нужно удалить все пустые и только пробельные совпадения или исключить их из поиска.
Как мне это сделать?
Я хотел бы предложить что-то вроде этого:
<.*?>((?=[^<]*\S.*?<)([^<]+))<\/.*?>
или, если вы хотите включить новые строки в ваш матч:
(<.*?>)(?=[^<]*\S.*[<\n])([^<]+)(<\/.*?>)
Это похоже на ваш awnser в замене вашей подходящей группы [^<]+
чтобы убедиться, что хотя бы один символ возвращается
Тем не менее, чтобы убедиться, что только строки с пробелами не будут сопоставлены, после сопоставления с открывающим тегом добавляется предварительный просмотр:
(?=[^<]*\S.*?<)
Это гарантирует, что между двумя тегами есть хотя бы один символ, который не является пробелом.
До:
preg_replace('/<.*?>([^<]*)<\/.*?>/', "new_text", $str)
Use +: preg_replace('/<.*?>([^<]+)<\/.*?>/', "new_text", $str)