2014-12-26 3 views
0

Как проверить переменное количество элементов в строке?Поиск нескольких элементов с регулярным выражением

[keyword1|keyword2|keyword3] 
[keyword1|keyword2] 

... или более трех ключевых слов. Это просто работа для трех элементов:

preg_match("/^\[(.*)\|(.*)\|(.*)\]$/",$string, $matches) 

Edit: Как я могу получить захваченное ключевое слово в переменных? то есть:

matches[1] = keyword1 
matches[2] = keyword2 
matches[3] = keyword3 
+0

Вы хотите для 3 и более? –

+0

Вам понадобятся два отдельных шаблона: один для проверки строки и один для извлечения ключевых слов. –

+0

@ AvinashRaj: переменное число, это означает 1 или более ключевых слов в этой строке (начиная с [и заканчивая]) – user3142695

ответ

1

Используйте это, 3 и более.

^\[[^|\n]*(?:\|[^|\n]*){2,}\]$ 

DEMO

более чем на 3,

^\[[^|\n]*(?:\|[^|\n]*){3,}]$ 

DEMO

Вы могли бы сделать просто, как это через \G якорь,

(?:^\[|\G)\|?([^\n|\]]+)(?=[\]|]) 

Используйте привязку \G, чтобы выполнить непрерывное совпадение строк.

DEMO

+0

'preg_match ("/^ \ [[^ | \ n] * (?: \ | [^ | \ n] *) {2,} \] $/", $ string, $ matches)' Итак, мой результат будет: $ matches [1], $ matches [2], ... $ matches [n]. Верный? – user3142695

+0

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

+0

Да, извините за недопустимый вопрос. Обновлен вопрос. – user3142695

2

Вы можете использовать:

(?:^\[(?=[^][|]*(?:\|[^][|]*)*\])|(?!^)\G)([^][|]*)(?:[]|]) 

Regular expression visualization

DEMO

Этот метод объясняется в деталях HERE

+0

Ничего себе. Мне очень тяжело. Я попытаюсь понять это выражение ... – user3142695

+0

@ user3142695 Это выглядит страшно, но как только вы прочитали документ (ссылка выше), вы увидите, насколько это просто :) – Enissay

+0

Я не знаю, почему вы делаете материал так complex ... –