Довольно простой, но я не могу получить точный синтаксис.preg_match для предложений, начинающихся с 'для'
Я просто хочу проверить истину или ложь, чтобы увидеть, существует ли строка с «для» (без учета регистра).
Довольно простой, но я не могу получить точный синтаксис.preg_match для предложений, начинающихся с 'для'
Я просто хочу проверить истину или ложь, чтобы увидеть, существует ли строка с «для» (без учета регистра).
Если это как раз то, то вы можете использовать обычный текстовый поиск:
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
никогда не является хорошим вариантом.Вот длинная версия:
return strpos($haystack, $needle) === 0
return preg_match("/^$needle/", $haystack) === 1
return substr($haystack, 0, strlen($needle)) === $needle
return strncmp($needle, $haystack, strlen($needle)) === 0
for ($i = 0, $l = strlen($needle); $i < $l; ++$i) {
if ($needle{$i} !== $haystack{$i}) return false;
}
return true;
Интересные баллы:
strpos
на длинной, целиком несогласующейс иглой против короткого стог сена.
strpos
записал верхние 11 раз.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 |
-----------------------------------------------------------------------------
Если бы у вас был read the first example in the documentation, вы бы видели ответ.
if (preg_match('/^for the/i', $sentence))
{
// a match was found
}
регулярное выражение является /^for the/i
Как насчет
if(preg_match("/^for the/", $yourString))
{
return true;
}
else
{
return false;
}
Обратите внимание на код ^
, соответствует началу строка.
Вы хотите использовать ^
для обозначения начала строки:
$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
является та часть, которая делает поиск чувствителен к регистру.
+1, регулярные выражения, как правило, более ресурсоемкие, чем strpos() и связанные. –
Это был мой первый инстинкт, но он довольно неэффективен для больших строк. Даже если $ text не начинается с «для», он будет продолжать поиск остальной части строки, которая может составлять тысячи байтов. –
@Jordan, не то же самое относится к регулярным выражениям? –