Вот что я бы сделал:
$a = '<h1>Heading</h1>
<br>
<br />
<a href="#">hyperlink</a>
<p></p>
<p>paragraph1</p>
<p>paragraph2</p>';
echo trim(preg_replace(['/<[^>]*>/','/\s+/'],' ', $a));
Вывод
Heading hyperlink paragraph1 paragraph2
Песочница
Первое регулярное выражение удаляет теги, заменяя их напробел, второй занимает несколько пробелов и заменяет его на один.
Это работает довольно хорошо, но я вижу способ, которым он может отклоняться от того, что было специально запрошено.
Что такое регулярное выражение для удаления всех html-тегов и где теги
и
заменяются на один пробел и удаляются все разрывы строк
Итакесли вы хотите «полное» решение, вы можете сделать это:
$a = '<h1>Heading</h1>
<br>
<br />
<a href="#">hyperlink</a>
<p></p>
<p><big>p</big>aragraph1</p><p>paragraph2</p>';
echo preg_replace([
'/<(?:br|p)[^>]*>/i', //replace br p with ' '
'/<[^>]*>/', //replace any tag with ''
'/\s+/', //remove run on space
'/^\s+|\s+$/' //trim
],[
' ', '', ' ', ''
], $a);
Обратите внимание, что я добавил тег <big>
и удалил все пробелы между тегами <p>
.Это было сделано, чтобы выделить несколько вещей.
Например, если вы берете текст из второго примера и используете его в первом, вы получите следующее (потому что большой тег):
Heading hyperlink p aragraph1 paragraph2
Обновленный пример выводит правильно.Но, и это большое, но я изменил вводимый текст, поэтому, возможно, нет необходимости чрезмерно усложнять его.
Тэг <p>
просто показывает, что он помещает пространство между ними перед удалениемвсе HTML-теги с ''.
Песочница
ОБНОВЛЕНИЕ
@ ArtisticPhoenix как мне разместить <p> </p>
Сначала я бы преобразовал строку, используя html_entity_decode
, но с этим есть несколько неприятных моментов.Это связано с кодированием.Так что это правильный способ сделать это:
$a = '<h1>Heading</h1>
<br>
<br />
<a href="#">hyperlink</a>
<p> </p>
<p><big>p</big>aragraph1</p><p>paragraph2</p>';
//convert entities using UTF-8
$a = html_entity_decode($a, ENT_QUOTES, 'UTF-8');
echo preg_replace([
'/<(?:br|p)[^>]*>/i', //replace br p with ' '
'/<[^>]*>/', //replace any tag with ''
'/\s+/u', //remove run on space - replace using the unicode flag
'/^\s+|\s+$/u' //trim - replace using the unicode flag
],[
' ', '', ' ', ''
], $a);
Обратите внимание на добавление флага u
к регулярному выражению выше /\s+/u
и /^\s+|\s+$/u
.
u (PCRE_UTF8) Этот модификатор включает дополнительные функции PCRE, несовместимые с Perl.Шаблонные и предметные строки рассматриваются как UTF-8.Недопустимый субъект приведет к тому, что функция preg_ * ничего не найдет;неверный шаблон вызовет ошибку уровня E_WARNING.Последовательности UTF-8 с пятью и шестью октетами считаются недействительными начиная с PHP 5.3.4 (соответственно PCRE 7.3 2007-08-28);ранее они считались действительными UTF-8.
Проблема заключается в том, что он расшифровывается в ASCII 160
(nbsp) вместо ASCII 32
символа (один пробел).В любом случае мы можем использовать UTF-8 для сортировки, как показано выше.
Песочница