Как проверить, начинается ли строка с указанной строки? [Дубликат]

279

Я пытаюсь проверить, начинается ли строка с http. Как я могу выполнить эту проверку?

$string1 = 'google.com';
$string2 = 'http://www.google.com';
  • 0
    Возможно, вы захотите попробовать эту автономную библиотеку, которая может быть использована без каких-либо рамок. Он включает в себя как startsWith и endsWith в startsWith с endsWith startsWith и без endsWith регистра.
  • 0
    Поскольку это такой широко используемый фреймворк, стоит упомянуть, что если вы используете Laravel, у вас есть вспомогательные функции starts_with и ends_with .
Теги:

6 ответов

440
Лучший ответ
substr( $string_n, 0, 4 ) === "http"

Если вы пытаетесь убедиться, что это не другой протокол. Вместо этого я использовал бы http://, так как https также соответствовал бы и другим вещам, таким как http-protocol.com.

substr( $string_n, 0, 7 ) === "http://"

И вообще:

substr($string, 0, strlen($query)) === $query
  • 68
    Нет необходимости жестко кодировать длину строки, как указано ниже, если ваша стрелка является переменной. Просто используйте substr ($ string, 0, strlen ($ query)) === $ query.
  • 14
    Будьте осторожны при использовании многобайтовых строк utf8! mb_substr твой друг
Показать ещё 3 комментария
373

Используйте strpos():

if (strpos($string2, 'http') === 0) {
   // It starts with 'http'
}

Помните три знака равенства (===). Он не будет работать должным образом, если вы используете только два. Это связано с тем, что strpos() вернет false, если игла не может быть найдена в стоге сена.

  • 23
    Нет необходимости искать всю строку ( strpos останавливается, если игла найдена или конец достигнут), если вам просто нужно посмотреть на определенную позицию.
  • 0
    Что тривиально для коротких строк, но я поддержу ваше предложение substr ().
Показать ещё 8 комментариев
43

Существует также функция strncmp() и strncasecmp(), которая идеально подходит для этой ситуации:

if (strncmp($string_n, "http", 4) === 0)

В общем:

if (strncmp($string_n, $prefix, strlen($prefix)) === 0)

Преимущество подхода substr() состоит в том, что strncmp() выполняет только то, что необходимо сделать, не создавая временную строку.

  • 5
    strncmp () хорош, потому что он не генерирует мусор, как substr (). Это также лучше, чем strpos (), потому что не нужно сканировать всю строку. Это менее удобно в том смысле, что вам действительно нужно жестко кодировать или вычислять длину префикса, и если вы ошибетесь или измените его позже, функция может перестать работать.
  • 4
    Ух ты, есть много ответов на эту простую проблему. Я выбрал вашу как лучшую: просто верните strncmp ($ url, 'http', 4) === 0. Множество строковых функций на выбор в руководстве, но это очевидное решение проблемы, и я ' Я бы рискнул догадаться, что это лучший результат.
31

Вы можете использовать простое регулярное выражение (обновленная версия от пользователя viriathus, поскольку eregi устарела)

if (preg_match('#^http#', $url) === 1) {
    // Starts with http (case sensitive).
}

или если вы хотите нечувствительный к регистру поиск

if (preg_match('#^http#i', $url) === 1) {
    // Starts with http (case insensitive).
}

Режимы позволяют выполнять более сложные задачи

if (preg_match('#^https?://#i', $url) === 1) {
    // Starts with http:// or https:// (case insensitive).
}

Эффективность, вам не нужно создавать новую строку (в отличие от substr) и не анализировать всю строку, если она не начинается с того, что вы хотите. У вас будет штраф за выполнение, хотя в первый раз вы используете регулярное выражение (вам нужно создать/скомпилировать его).

Это расширение поддерживает глобальный кеш для каждого потока скомпилированных регулярных выражений (до 4096). http://www.php.net/manual/en/intro.pcre.php

  • 0
    +1 с моего конца.
  • 3
    regex гораздо сложнее, чем операция strpos или substr, поэтому он стоит больше производительности и в этой задаче он определенно не нужен
Показать ещё 5 комментариев
4

Вы можете проверить, начинается ли ваша строка с http или https с помощью функции preg_match, ниже.

$url   = 'http://www.google.com';
$http  = preg_match('/^http[^s]/i', $url);
$https = preg_match('/^https/i', $url);

echo 'the url ' . ($http  ? 'does' : 'does not') . ' start with http';
echo 'the url ' . ($https ? 'does' : 'does not') . ' start with https';
  • 2
    Если кто-нибудь читает ответь на этот вопрос, то что это троицы ? true : false избыточны и могут быть полностью удалены
-5

Также работайте:

if (eregi("^http:", $url)) {
 echo "OK";
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню