2010-01-12 3 views

ответ

15

Если это как раз то, то вы можете использовать обычный текстовый поиск:

if (stripos("for the", $text) === 0) { // case-insensitive here 
    // string starts with "for the" 
} 

Или

if (substr($text, 0, 7) == "for the") 

Комментарии ниже у меня интересно, о чем на самом деле быстрее , поэтому я написал несколько бенчмаркинга.

Вот версия TLDR:

  • strpos очень быстро, если вы не работаете с большими строками.
  • strncmp надежный и быстрый.
  • preg_match никогда не является хорошим вариантом.

Вот длинная версия:

  • Два разных "стога":
    1. 10000 символов lipsum
    2. 83 символов Lipsum.
  • 5 различных способа поиска:
    1. strpos:
      return strpos($haystack, $needle) === 0
    2. preg_match
      return preg_match("/^$needle/", $haystack) === 1
    3. substr
      return substr($haystack, 0, strlen($needle)) === $needle
    4. strncmp return strncmp($needle, $haystack, strlen($needle)) === 0
    5. Руководство перекручивание:
for ($i = 0, $l = strlen($needle); $i < $l; ++$i) { 
    if ($needle{$i} !== $haystack{$i}) return false; 
} 
return true;
  • 7 различных "игл"
    • 3 согласующих (длина: 83, 5 и 1 символ)
    • 4 не являющиеся -множение (длины: 83, 82, 5 и 1 символ). Игла 82 char не совпадает вообще, и иглы с 83 символами соответствуют всем, кроме последнего символа.
  • 100000 итераций, в способе на иглу в стоге

Интересные баллы:

  • Самый быстрый индивидуальный тест все было strpos на длинной, целиком несогласующейс иглой против короткого стог сена.
    • Фактически, из 14 испытаний, проведенных по методу, strpos записал верхние 11 раз.
  • Самый медленный индивидуальный тест был ручным методом для длинных игл, независимо от размера сена. Эти четыре теста были в 10-20 раз медленнее, чем почти все остальные тесты.
  • Хотя strpos имел лучшую производительность, он был отягощен длинными несогласованными иглами на длинной стоге сена. Они были в 5-10 раз медленнее, чем большинство тестов.
  • strncmp был быстрым и самых последовательных.
  • preg_match был последовательно примерно в 2 раза медленнее, чем другие функции
Haystack: 83 characters 
       ______________________________________________________________ 
____________|__________ non-matching ___________|_______ matching ________| 
| function | 1 | 5 | 82 | 83 | 1 | 5 | 83 | 
|------------+--------+--------+--------+--------+--------+--------+--------| 
| manual  | 0.2291 | 0.2222 | 0.2266 | 4.1523 | 0.2337 | 0.4263 | 4.1972 | 
| preg_match | 0.3622 | 0.3792 | 0.4098 | 0.4656 | 0.3642 | 0.3694 | 0.4658 | 
| strncmp | 0.1860 | 0.1918 | 0.1881 | 0.1981 | 0.1841 | 0.1857 | 0.1980 | 
| strpos  | 0.1596 | 0.1633 | 0.1537 | 0.1560 | 0.1571 | 0.1589 | 0.1681 | 
| substr  | 0.2052 | 0.2066 | 0.2009 | 0.2166 | 0.2061 | 0.2017 | 0.2236 | 
----------------------------------------------------------------------------- 

Haystack: 10000 characters 
       ______________________________________________________________ 
____________|__________ non-matching ___________|_______ matching ________| 
| function | 1 | 5 | 82 | 83 | 1 | 5 | 83 | 
|------------+--------+--------+--------+--------+--------+--------+--------| 
| manual  | 0.2275 | 0.2249 | 0.2278 | 4.1507 | 0.2315 | 0.4233 | 4.1834 | 
| preg_match | 0.3597 | 0.3628 | 0.4147 | 0.4654 | 0.3662 | 0.3679 | 0.4684 | 
| strncmp | 0.1886 | 0.1914 | 0.1835 | 0.2014 | 0.1851 | 0.1854 | 0.1989 | 
| strpos  | 0.1605 | 2.1877 | 2.3737 | 0.5933 | 0.1575 | 0.1597 | 0.1667 | 
| substr  | 0.2073 | 0.2085 | 0.2017 | 0.2152 | 0.2036 | 0.2090 | 0.2183 | 
-----------------------------------------------------------------------------
+0

+1, регулярные выражения, как правило, более ресурсоемкие, чем strpos() и связанные. –

+1

Это был мой первый инстинкт, но он довольно неэффективен для больших строк. Даже если $ text не начинается с «для», он будет продолжать поиск остальной части строки, которая может составлять тысячи байтов. –

+0

@Jordan, не то же самое относится к регулярным выражениям? –

1

Как насчет

if(preg_match("/^for the/", $yourString)) 
{ 
    return true; 
}     
else 
{ 
    return false; 
} 

Обратите внимание на код ^, соответствует началу строка.

3

Вы хотите использовать ^ для обозначения начала строки:

$string_one = "For the love of Mike"; 
$string_two = "for the amazing reason."; 

$match = preg_match("/^for the/i", $string_one); // Outputs 1 
$match = preg_match("/^for the/i", $string_two); // Outputs 1 

/i является та часть, которая делает поиск чувствителен к регистру.

Смежные вопросы