我如何编写两个函数,如果它以指定的字符/字符串开头或以指定的字符串结尾,那么它们将接受字符串并返回?

例如:

$str = '|apples}';

echo startsWith($str, '|'); //Returns true
echo endsWith($str, '}'); //Returns true

当前回答

这是一个接受答案的多字节安全版本,它适用于UTF-8字符串:

function startsWith($haystack, $needle)
{
    $length = mb_strlen($needle, 'UTF-8');
    return (mb_substr($haystack, 0, $length, 'UTF-8') === $needle);
}

function endsWith($haystack, $needle)
{
    $length = mb_strlen($needle, 'UTF-8');
    return $length === 0 ||
        (mb_substr($haystack, -$length, $length, 'UTF-8') === $needle);
}

其他回答

PHP 8更新

PHP 8包含了新的str_starts_with和str_ends_with函数,它们最终为这个问题提供了一个高效便捷的解决方案:

$str = "beginningMiddleEnd";
if (str_starts_with($str, "beg")) echo "printed\n";
if (str_starts_with($str, "Beg")) echo "not printed\n";
if (str_ends_with($str, "End")) echo "printed\n";
if (str_ends_with($str, "end")) echo "not printed\n";

该特性的RFC提供了更多信息,同时也讨论了明显(但不那么明显)用户区域实现的优点和问题。

您可以使用substra_compare函数检查开头和结尾:

function startsWith($haystack, $needle) {
    return substr_compare($haystack, $needle, 0, strlen($needle)) === 0;
}
function endsWith($haystack, $needle) {
    return substr_compare($haystack, $needle, -strlen($needle)) === 0;
}

这应该是PHP7(基准脚本)上最快的解决方案之一。在8KB的干草堆、各种长度的针以及完全、部分和不匹配的情况下进行测试。strncmp是一种更快的开始方式,但它不能检查结束方式。

最近,我通常使用下划线php这样的库。

require_once("vendor/autoload.php"); //use if needed
use Underscore\Types\String; 

$str = "there is a string";
echo( String::startsWith($str, 'the') ); // 1
echo( String::endsWith($str, 'ring')); // 1   

图书馆里还有很多其他方便的功能。

还可以使用正则表达式:

function endsWith($haystack, $needle, $case=true) {
  return preg_match("/.*{$needle}$/" . (($case) ? "" : "i"), $haystack);
}

PHP 8.0及更高版本

从PHP 8.0开始,您可以使用

str_starts_with手册和

str_ends_with手动

实例

echo str_starts_with($str,'|');

8.0之前的PHP

function startsWith( $haystack, $needle ) {
     $length = strlen( $needle );
     return substr( $haystack, 0, $length ) === $needle;
}
function endsWith( $haystack, $needle ) {
    $length = strlen( $needle );
    if( !$length ) {
        return true;
    }
    return substr( $haystack, -$length ) === $needle;
}