2015-10-24 3 views
1

У меня есть строка, как например:Расщепление в 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. Я думаю, что самый простой способ сделать это - использовать регулярное выражение и поместить каждое слово (и препинание и пробел после него, но не тег linebreak, который должен быть отдельным словом).

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

  1. FIXED каждое слово Захваты для и пунктуации, но не пробелами. Когда я пытаюсь включить пробелы, все слова становятся одним совпадением.
  2. Захватывает [br] как часть слова. Мне нужно, чтобы [br] было отдельным словом со словом, прежде чем он НЕ имел пробелов после него (ex line 1: {adipiscing} {elit.}, {[Br]}

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

+0

Может быть, это регулярное выражение: ')) [. \ Ш,] + \ S *>' –

+0

ли кто-нибудь из ответов здесь работать для вас;? или у вас проблемы с любым из них? – chris85

ответ

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

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

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

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

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

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

+1

@WashingtonGuedes: это потому, что вы не установили хороший разделитель. –

0

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

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

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

var res = str.split(' '); 
  • Заменить <br> с ''.

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

1

Вы можете сделать это без регулярных выражений. Используйте теги strip, чтобы удалить все элементы, потому что <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- Strip все HTML-теги
2 Используйте RE шаблон, который не ставит белых пространств

Это то, что я понял из вопроса :), но извините, если I'am неправильно.

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

Удалите модификаторы, они бесполезны. –

+0

@CasimiretHippolyte Да, вы правы. –