2015-08-07 3 views
-1

Как извлечь слово/цитировали высказывание через регулярное выражение или эффективную альтернативу как таковой ?:Как извлечь слово или предложение из предшествующего тега?

tag:videos извлечет видео

tag:"my videos" извлечет моих видео

riding ponies tag:ponies извлечет ponies

riding ponies tag:"pony rider" будет e Xtract пони всадник

riding ponies tag: не извлечет НИЧТО

Способности поддерживать несколько тегов также будет большим, как:

travelling the world tag:"aussie guy" country:Australia экстракты австралийца парнем для тэга: и Австралии для страна:.

Цель состоит в том, чтобы включить это в поле ввода поиска, чтобы пользователи могли эффективно применять фильтры со своими поисковыми запросами.

Пожалуйста, дайте мне знать, как я могу это сделать, спасибо!

+1

Что вы пытались? Кроме того, непросто кодировать то, что вы хотите. В вашем примере слово «страна» также может быть тегом. – Akshay

+0

'(tag:) \ w +' - это то, что я пробовал, не работает точно и не обнаруживает кавычки. Я очень неопытен в регулярном выражении, поэтому я не знаю. Также. Чтобы уточнить, страна считается еще одним тегом. Я просто хочу удостовериться, что можно снять обе фразы из обоих отдельных тегов, если это означает смысл ... – Lorenc

ответ

2

Чтобы соответствовать всем name:value или name:"value" вы можете использовать эту conditional sub-pattern regex в preg_match_all функции вызова:

(\w+):"?\K((?(?<=")[^"]*|\w*)) 

RegEx Demo

Все name будут доступны в захваченной группы № 1 и value часть будет в плен группа №2.

RegEx Распад

(\w+)  # match 1 or more word characters in a group 
:   # match literal colon 
"?   # match a double quote optionally 
\K   # reset the matched data so fat 
((?...))  # conditional sub-pattern available in 2nd captured group 
?(?<=")  # condition is using look-behind if previous character is " 
[^"]*  # TRUE: match 0 or more characters that are not " 
|   # or if condition fails 
\w*   # FALSE: match 0 or more word characters 

PHP Code Demo

Чтобы соответствовать только tag и это value использование этого регулярное выражение:

\btag:"?\K((?(?<=")[^"]*|\w*)) 
+0

Это прекрасно, вопрос только в том, как подойти к тому, чтобы получить захват точного 'name' и' value'? (PHP-мудрый) – Lorenc

+0

Да, как вы возьмете, скажем, только «страна:» и «тег:» и значение с ним. Спасибо – Lorenc

+0

Проверьте обновленный ответ на образец кода PHP. Чтобы ответить на ваш вопрос для соответствия 'tag', вы можете использовать' \ btag: "? \ K ((? (? <=") [^ "] * | \ W *))' – anubhava

1

Я думаю, что это будет сделать то, что вы после:

/tag:('|")?(.+?)(\1|$)/m 

Демо: https://regex101.com/r/hN2gO2/1

PHP Использование:

preg_match_all('/tag:(\'|")?(.+?)(\1|$)/m', 'tag:videos 
tag:"my videos" 
riding ponies tag:ponies 
riding ponies tag:"pony rider" 
riding ponies tag: 
travelling the world tag:"aussie guy" country:Australia', $match); 
print_r($match[2]); 

Выход:

Array 
(
    [0] => videos 
    [1] => my videos 
    [2] => ponies 
    [3] => pony rider 
    [4] => aussie guy 
) 

Если tag взаимозаменяемы к любому слову сделать что \w+.

 Смежные вопросы

  • Нет связанных вопросов^_^