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

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

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

3 ответов


согласно руководству PHP, да -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-объекты используются только при выводе текста. Не сравнивая.


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


strpos возвращает начальную позицию первого появления строки, если никакое совпадение не вернет Null, поэтому оператор довольно удобен.

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