php - является ли strpos самым быстрым способом поиска строки в большом тексте? - PullRequest
16 голосов
/ 06 октября 2010
if (strpos(htmlentities($storage->getMessage($i)),'chocolate')) 

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

Ответы [ 3 ]

28 голосов
/ 06 октября 2010

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

Примечание:

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

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

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

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

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

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

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

Или, в худшем случае, вы можете даже заставить что-то истинное оценить как ложное.

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

Чтобы обойти это, вы должны использовать еще больше HTML-сущностей.

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

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

2 голосов
/ 06 октября 2010

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

0 голосов
/ 26 сентября 2018

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

if (!is_null(strpos($storage->getMessage($i),'chocolate'))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...