preg_match для предложений, начинающихся с 'for' - PullRequest
2 голосов
/ 12 января 2010

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

Я просто хочу проверить истинность или ложь, чтобы увидеть, существует ли строка с 'for' (без учета регистра).

Ответы [ 5 ]

15 голосов
/ 12 января 2010

Если это так, то вы можете использовать поиск по тексту:

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 символа губ.
  • 5 различных методов поиска:
    1. StrPos
      return strpos($haystack, $needle) === 0
    2. preg_match
      return preg_match("/^$needle/", $haystack) === 1
    3. зиЬзЬг
      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 символов совершенно не совпадает, а иглы из 83 символов соответствуют всем, кроме последнего символа.
  • 100 000 итераций, на метод на иглу в стоге сена

Интересные моменты:

  • Самым быстрым отдельным тестом из всех было 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     <strong>| 0.1596 | 0.1633 | 0.1537 | 0.1560 | 0.1571 | 0.1589 | 0.1681 |</strong>
| 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 | <strong>0.1914</strong> | <strong>0.1835</strong> | <strong>0.2014</strong> | 0.1851 | 0.1854 | 0.1989 |
| strpos     | <strong>0.1605</strong> | 2.1877 | 2.3737 | 0.5933 | <strong>0.1575</strong> | <strong>0.1597</strong> | <strong>0.1667</strong> |
| substr     | 0.2073 | 0.2085 | 0.2017 | 0.2152 | 0.2036 | 0.2090 | 0.2183 |
-----------------------------------------------------------------------------
3 голосов
/ 12 января 2010

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

$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 - это часть, которая делает поиск нечувствительным к регистру.

2 голосов
/ 12 января 2010

Как насчет

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

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

0 голосов
/ 12 января 2010

регулярное выражение /^for the/i

0 голосов
/ 12 января 2010

Если бы вы прочитали первый пример в документации , вы бы увидели ответ.

if ( preg_match('/^for the/i', $sentence) )
{
    // a match was found
}
...