Разделение на HTML-тег в регулярном выражении

У меня есть строка как таковая:

<p>
Lorem ipsum dolor sit amet, consectetur adipiscing elit.<br>
Mauris non rutrum velit. Morbi sed turpis in urna fermentum sodales.<br>
Proin aliquet nisi a congue egestas.
</p>

Я пытаюсь написать программу на PHP, чтобы взять каждое слово и поместить его в базу данных MySQL. Я думаю, что самый простой способ сделать это — использовать регулярное выражение и поставить каждое слово (и пунктуацию И пробел после него, но НЕ тег перевода строки, который должен быть отдельным словом).

Текущее регулярное выражение, которое я использую:/([\S]{1,} ?)/, Это выражение имеет следующие проблемы:

  1. ФИКСИРОВАННЫЙ Хватает каждое слово и пунктуацию, но не пробел. Когда я пытаюсь включить пробел, все слова становятся одним совпадением.
  2. Захватывает [br] как часть слова. Мне нужно, чтобы [br] было отдельным словом, а перед словом НЕ должно быть пробела (например, строка 1: {adipiscing} {elit.}, {[Br]}

Хорошо, что теги абзаца захвачены, это часть функциональности, которая мне нужна для моей таблицы MySQL.

1

Решение

Вы можете сделать это без регулярных выражений. Используйте метки полосы, чтобы удалить все элементы, потому что <sup><sub><em><i><strong><b><s> и другие элементы форматирования все сломаются. Тогда просто взорваться на пространствах.

$string = '<p>
Lorem ipsum dolor sit amet, consectetur adipiscing elit.<br>
Mauris non rutrum velit. Morbi sed turpis in urna fermentum sodales.<br>
Proin aliquet nisi a congue egestas.
</p>';
$words = explode(' ', trim(strip_tags($string)));
foreach ($words as $word) {
echo $word . "\n";
}

Выход:

Lorem
ipsum
dolor
sit
amet,
consectetur
adipiscing
elit.
Mauris
non
rutrum
velit.
Morbi
sed
turpis
in
urna
fermentum
sodales.
Proin
aliquet
nisi
a
congue
egestas.

Вы можете использовать регулярное выражение вместо взрыва, если хотите убрать пунктуацию, но это звучит так, как будто вы хотели этого со словом.

1

Другие решения

Если вы хотите просто слова, но теги HTML & пространства;

1- Удалите все теги HTML
2- Используйте шаблон RE, который не ставит пробелы

Это то, что я понял из вопроса :), но извините, если я ошибаюсь.

$input = strip_tags($input);
$words = preg_split('~\s+~', $input, -1, PREG_SPLIT_NO_EMPTY);
1

(<\s*[^\s="'>]+(\s+[^\s="'>]+(=("[^"]*"|'[^']*'))?)*\s*/?>|<\s*/\s*[^\s="'>]+\s*>|\S+)\s*

Это регулярное выражение состоит из трех частей:

<\s*[^\s="'>]+(\s+[^\s="'>]+(=("[^"]*"|'[^']*'))?)*\s*/?> Это находит HTML открывающие теги. Он допускает произвольное заполнение пробелом в теге, атрибуты в кавычках, логические атрибуты и самозакрывающиеся теги.

<\s*/\s*[^\s="'>]+\s*> Это находит HTML конечные теги. Это проще, так как ему не нужно делать атрибуты.

\S+ Это тот, который просто ищет последовательность символов, не являющихся пробелами, и ловит не-HTML слова и знаки препинания.

Наконец, я сгруппировал все это и добавил \s* поймать любой пробел после тега или слова.

0

Вы можете попробовать это:

  • Игнорировать пробелы:

var str = '<p> some string here... </p> ';

var res = str.split(' ');
  • замещать <br> с ».

Итак, результат должен быть: var res = str.split(' ').replace('<br>', '');

0
По вопросам рекламы [email protected]