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('<img src...','<'); // FALSE
чтобы обойти это, вы в конечном итоге использование еще большего количества объектов HTML.
strpos('<img src...', '<'); // 0
но это, как вы можете себе представить, не только раздражает код, но и становится избыточным. Вам лучше полностью исключить HTML-объекты. Обычно HTML-объекты используются только при выводе текста. Не сравнивая.
strpos вероятно, будет быстрее, чем функции preg_match и альтернативы в этом случае лучшей идеей было бы сделать некоторые собственные критерии с реальными данными примера и посмотреть, что лучше для ваших нужд, хотя это может быть переусердствовать. Не беспокойтесь слишком много о производительности, пока она не начнет становиться проблемой
strpos возвращает начальную позицию первого появления строки, если никакое совпадение не вернет Null, поэтому оператор довольно удобен.
if (!is_null(strpos($storage->getMessage($i),'chocolate'))