Php - является ли strpos самым быстрым способом поиска строки в большом тексте?

if (strpos(htmlentities($storage->getMessage($i)),'chocolate')) 

Привет, я использую gmail oauth для поиска определенных текстовых строк в адресах электронной почты. Можно ли быстрее и эффективнее находить экземпляры текста, чем использовать strpos в приведенном выше коде? Должен ли я использовать хэш-метод?

Ответ 1

Согласно руководству PHP, yes- strpos() - это самый быстрый способ определить, содержит ли одна строка другую.

Примечание:

Если вы хотите только определить, происходит ли конкретная игла в стоге сена,    вместо этого используйте более быструю и менее интенсивную память функцию strpos().

Это время и время цитируется в любой статье php.net о других строковых компараторах (я вытащил это из strstr())

Хотя есть два изменения, которые должны быть внесены в ваш оператор.

if (strpos($storage->getMessage($i),'chocolate') !== FALSE)

Это потому, что if(0) оценивается как false (и поэтому не работает), однако strpos() может возвращать 0, если игла находится в самом начале (позиция 0) стога сена. Кроме того, удаление htmlentities() сделает ваш код намного быстрее. Все, что htmlentities() делает, заменяет определенные символы соответствующим HTML-эквивалентом. Например, он заменяет каждый & на &

Как вы можете себе представить, проверка символа каждого в строке индивидуально и замена многих из них чрезвычайно интенсивно связана с памятью и процессором. Не только это, но это необязательно, если вы планируете просто выполнять текстовое сравнение. Например, сравните следующие утверждения:

strpos('Billy & Sally', '&'); // 6
strpos('Billy & Sally', '&'); // 6
strpos('Billy & Sally', 'S'); // 8
strpos('Billy & Sally', 'S') // 12

Или, в еще более экстремальном случае, вы можете даже заставить что-то истинное оценивать как false.

strpos('<img src...', '<'); // 0
strpos('&lt;img src...','<'); // FALSE

Чтобы обойти это, вы можете использовать еще больше объектов HTML.

strpos('&lt;img src...', '&lt;'); // 0

Но это, как вы можете себе представить, не только раздражает код, но и становится излишним. Вам лучше исключить HTML-объекты целиком. Обычно объекты HTML используются только при выводе текста. Не сравнивать.

Ответ 2

strpos, скорее всего, будет быстрее, чем preg_match, а альтернативы в этом случае - лучшая идея - сделать некоторые собственные тесты с реальными примерами данных и увидеть что лучше всего подходит для ваших нужд, хотя это может переусердствовать. Не беспокойтесь о производительности, пока он не станет проблемой