Более быстрая альтернатива preg_match при сохранении логики поиска

1

У меня возникло несколько проблем со скоростью функции поиска, которую я создал.

В моем поиске используется preg_match, чтобы отделить ключевые слова от текста. Он может искать "Интернационал", но не "Интернет" или "Международный".

Но он работает очень медленно, есть ли способ ускорить работу?

 foreach ($keywords as $Word)
 {
   if (preg_match("/\S*\b($Word)[s]?\b\S*/i", $Text))
   {
     return $Word;
   }
 }

Благодаря :)

  • 0
    После удаления первого \S* выражение будет достаточно быстрым. Второй также избыточен в вашем preg_match .
  • 1
    И \S* не имеет смысла в этом контексте в любом случае. \S соответствует любому непробельному символу, что я не могу поверить в то, что вы имели в виду, и * делает его необязательным, так что в любом случае это не имеет никакого эффекта (кроме как для замедления соответствия).
Теги:
preg-match

1 ответ

0
Лучший ответ

Удалив первое \S* выражение будет достаточно быстрым. Второй из них также избыточен в preg_match.

Вам также необходимо дважды избегать метасимволов регулярных выражений в двуязычном регулярном выражении PHP.

использование

foreach ($keywords as $Word)
 {
   if (preg_match("/\\b(" . preg_quote($Word) . ")s?\\b/i", $Text))
   {
     return $Word;
   }
 }

См. Эту демонстрационную версию IDEONE

Обратите внимание: если у вас есть специальные символы (например, [ или () внутри массива $ keywords, вам нужно использовать "/(?<!\\w)(". preg_quote($Word). ")s?(?!\\w)/i" регулярное выражение.

  • 1
    Спасибо за ваши слова мудрости. Я проверил 3 метода ускорения поиска, и ваши каналы увеличили скорость как минимум на 40%.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню