preg_match () vs strpos () для поиска соответствия?

Для проверки одного значения , какой из них является предпочтительным и почему?

$string == 'The quick brown fox jumps over the lazy dog'; if(strpos($string, 'fox') !== false){ // do the routine } # versus if(preg_match('/fox/i', $string)){ // do the routine } 

Related of "preg_match () vs strpos () для поиска соответствия?"

Я предпочел бы strpos над preg_match , потому что регулярные выражения обычно более дороги для выполнения.

Согласно официальным документам php для preg_match :

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

Если у вас есть сомнения, контрольный показатель!

Очевидно, что мы могли бы найти лучший тест, чем этот, но просто чтобы доказать, что, когда он начнет увеличиваться, strpos() будет довольно быстрым. (почти в 2 раза быстрее)

EDIT Я позже заметил, что регулярное выражение было нечувствительным к регистру. При повторном stripos() с помощью stripos() для более справедливого сравнения результат составляет от 11 до 15, поэтому разрыв сужается, но preg_match() остается намного медленнее.

 $str = "the quick brown fox"; $start1 = time(); for ($i = 0; $i<10000000; $i++) { if (strpos($str, 'fox') !== false) { // } } $end1 = time(); echo $end1 - $start1 . "\n"; $start2 = time(); for ($i = 0; $i<10000000; $i++) { if (preg_match('/fox/i', $str)) { // } } $end2 = time(); echo $end2 - $start2; // Results: strpos() = 8sec preg_match() = 15sec // Results both case-insensitive (stripos()): stripos() = 11sec preg_match() = 15sec 

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

У вас также есть большая погрешность с регулярными выражениями – несогласованными строками, неожиданными результатами и т. Д. Придерживайтесь strpos, если strpos недостаточно гибкая.

Если вы уже используете preg_match и preg_replace повсюду в своем коде, продолжайте и используйте его еще раз. Зачем?

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

  2. Читаемость. strpos(...)!==false , а быстрее, это невероятное бельмо на глазу .

    Это одна из самых уродливых php-конструкций.
    Использование == и false в нем действительно kludgy и смотреть трудно разобрать и хрупкий для редактирования.

Позор в основной команде за то, что не определил псевдоним типа strcontains() для него несколько лет назад.
Сейчас уже слишком поздно это делать, но тогда было бы хорошо.

Поэтому, если кто-то думает, что этот тип вещей имеет какое-либо значение, следует принять во внимание, что он является константой в Big O. Другими словами, запросы к базе данных, On ^ 2 или худшая активность – это все, что имеет значение. Время, затрачиваемое на эти команды низкого уровня, бессмысленно в большинстве случаев. Не говоря о том, что константы следует игнорировать, например, я реорганизовал код, который захватил изображения, потому что он делал это по одному за один секундой каждый, где он уменьшал его с 12 секунд до 1 секунды (с использованием запроса с несколькими завивателями). Дело в том, что встроенные команды более низкого уровня, более важна структура кода.

Ниже приведен код 10 миллионов звонков, а «сбережения» почти ничего.

 function prof_flag($str) { global $prof_timing, $prof_names; $prof_timing[] = microtime(true); $prof_names[] = $str; } function prof_print() { global $prof_timing, $prof_names; $size = count($prof_timing); for($i=0;$i<$size - 1; $i++) { echo "<b>{$prof_names[$i]}</b><br>"; echo sprintf("&nbsp;&nbsp;&nbsp;%f<br>", $prof_timing[$i+1]-$prof_timing[$i]); } echo "<b>{$prof_names[$size-1]}</b><br>"; } $l = 10000000; $str = "the quick brown fox"; echo "<h3>Ran " .number_format($l,2) ." calls per command </h3>"; prof_flag("Start: stripos"); for ($i = 0; $i<$l; $i++) if (stripos($str, 'fox') !== false) {} prof_flag("Start: preg_match"); for ($i = 0; $i<$l; $i++) if (preg_match('#fox#i', $str) === 1) {} prof_flag("Finished"); prof_print(); 

Только значение для этого кода заключается в том, что он показывает классный способ записи времени, которое требуется для запуска LOL

 Ran 10,000,000.00 calls per command Start: stripos 2.217225 Start: preg_match 3.788667 Start: == 0.511315 Start: ucwords lol 2.112984 Finished 

Вы можете оптимизировать вышеуказанное preg_match , написав:

 preg_match('/(?>fox)/', $str) 

это должно быть быстрее.