поиск в строках, чтобы найти слово с preg, соответствует всем и регулярному выражению

я пытаюсь закодировать функцию поиска для поиска в строках и найти слово

например, php + mysql

Select * From Column Where ID Like %Word%

я пытался закодировать ту же идею с помощью Preg match all и regex

Вот мой код

$strings = '
( monstername 205 "Devil Troop of Desire")
( monstername 206 "  Devil Troop of Pain     "  )
( monstername 207       "Devil Troop of Greed")
( monstername 208   "       Devil Troop of Jealousy  ")
( monstername 207 "Mask Troop of Greed"  )';

preg_match_all('/monstername\s*(.*?)\s*\"\s*\\b(Jealousy)\b\s*\"\s*\)/i', $strings, $matches, PREG_SET_ORDER);
foreach ($matches as $match){list (, $MonsterNumber) = $match;
echo "$MonsterNumber";
}

вывод должен быть

208

но он не отображает вывод правильно

он отображает это, когда я заменяю Ревность на Devil Troop of Jealousy

я просто хочу сделать ту же идею php + mysql

Где ID Нравится %Word%

без полной строки, чтобы найти номер монстра


person beshoy Mounir    schedule 01.11.2012    source источник
comment
Мои навыки регулярных выражений не так уж плохи прямо сейчас, так как вчера я использовал регулярные выражения в PHP. Однако моя проблема заключается в том, чтобы понять, что вы пытаетесь сделать, почему на выходе будет 208? Если бы это было похоже на mysql, у вас было бы количество совпадающих строк, но получение 208 похоже на возврат ОДНОГО результата с использованием MAX():/   -  person HenchHacker    schedule 01.11.2012


Ответы (3)


Часть "\s*\\b(Jea не допускает других символов, кроме пробела между кавычкой и началом слова. Вы, вероятно, хотели, чтобы между ними был какой-либо символ (или даже ни одного?), Например, ".*\\b(Jea и та же проблема после слова.

person Levente Pánczél    schedule 01.11.2012
comment
ну, это работало нормально, но можно было написать только Jea Like .*\\b(Jea)\b.*\ и получить вывод, потому что я пробовал, но это не сработало, и это скрипт поиска - person beshoy Mounir; 01.11.2012

Вы должны лучше определить, что вы ищете: до и после Jealousy у вас могут быть пробелы/не пробелы, символы без кавычек.

preg_match_all('/\( monstername\s*(\d+)\s*"\s*([^"]*\bJealousy\b[^"]*)\s*"\s*\)/i',
$strings, $matches, PREG_SET_ORDER);

Или использовать в поисковом скрипте,

preg_match_all('/\( monstername\s*(\d+)\s*"\s*([^"]*(Jealousy)[^"]*)\s*"\s*\)/i',
$strings, $matches, PREG_SET_ORDER);

Для каждого совпадающего монстра он вернет совпадающую строку, номер монстра, имя монстра и совпадающий шаблон:

Array
(
    [0] => Array
        (
            [0] => ( monstername 208   "       Devil Troop of Jealousy  ")
            [1] => 208
            [2] => Devil Troop of Jealousy
            [3] => Jealousy
        )
)
person LSerni    schedule 01.11.2012

Что ж, если вам нужен только номер монстра в качестве вывода, это регулярное выражение соответствует только номеру и ничего вокруг него из-за просмотра вперед и просмотра назад:

/(?<=monstername\s)\d+(?=.*Jealousy.*)/i

Но при этом у вас может быть только один пробел между «имя монстра» и числом.

person Skyte    schedule 01.11.2012