strlen

(PHP 4, PHP 5, PHP 7, PHP 8)

strlen获取字符串长度

描述

strlen(string $string): int

返回给定 string 的长度。

参数

string

要测量长度的 string

返回值

string 的长度(以字节为单位)。

示例

示例 #1 strlen() 示例

<?php
$str
= 'abcdef';
echo
strlen($str); // 6

$str = ' ab cd ';
echo
strlen($str); // 7
?>

注释

注意:

strlen() 返回字节数而不是字符串中的字符数。

参见

添加注释

用户贡献的注释 7 个注释

226
rm dot nasir at hotmail dot com
8 年前
我想与 PHP 新手或初学者分享一些关于使用 UTF8 编码字符或以下语言的字符串的重要内容:阿拉伯语、波斯语、普什图语、达里语、简体中文、繁体中文、日语、越南语、乌尔都语、马其顿语、立陶宛语等。
正如手册中所述:“strlen() 返回字节数而不是字符串中的字符数”,因此如果您想获取 UTF8 字符串中字符的个数,请使用 mb_strlen() 而不是 strlen()。

示例

<?php
// 以下阿拉伯语(Hello)字符串:59 个字节,32 个字符
$utf8 = "السلام علیکم ورحمة الله وبرکاته!";

var_export( strlen($utf8) ); // 59
echo "<br>";
var_export( mb_strlen($utf8, 'utf8') ); // 32
?>
22
joeri at sebrechts dot net
8 年前
在检查长度以确保值可以放入数据库字段时,请注意使用正确的函数。

存在三种可能的情况

1. 最有可能的情况:数据库列为 UTF-8,长度以 Unicode 码点定义(例如,mysql varchar(200) 用于 utf-8 数据库)。

<?php
// 如果 php.ini default_charset 设置为 UTF-8(= 默认值),则正确
mb_strlen($value);
iconv_strlen($value);
// 始终正确
mb_strlen($value, "UTF-8");
iconv_strlen($value, "UTF-8");

// 错误,不要使用:
strlen(utf8_decode($value)); // 对于某些多字节字符会失败
grapheme_strlen($value); // 统计 grapheme,而不是码点
?>

2. 数据库列的长度以字节定义(例如,oracle 的 VARCHAR2(200 BYTE))。

<?php
// 正确,但假设 php.ini 中的 mbstring.func_overload 为 0(= 默认值)
strlen($value);
// 正确,强制以字节为单位进行统计
mb_strlen($value, "8bit")
?>

3. 数据库列使用其他字符集(UTF-16、ISO-8859-1 等),长度以字符/码点定义。

找到使用的字符集,并将其显式传递给长度函数。

<?php
// 正确,支持的字符集:https://php.net/manual/en/mbstring.supported-encodings.php
mb_strlen($value, $charset);
// 正确,支持的字符集:https://www.gnu.org/software/libiconv/
iconv_strlen($value, $charset);
?>
27
jasonrohrer at fastmail dot fm
11 年前
PHP 的 strlen 函数在处理空字节 ('\0') 方面与 C strlen 函数的行为不同。

在 PHP 中,字符串中的空字节不作为字符串的结尾,任何空字节都包含在字符串的长度中。

例如,在 PHP 中

strlen( "te\0st" ) = 5

在 C 中,相同的调用将返回 2。

因此,PHP 的 strlen 函数可用于查找二进制字符串中的字节数(例如,base64_decode 返回的二进制数据)。
5
Daniel Klein
1 年前
从 PHP 8.0 开始,将 null 传递给 strlen() 已被弃用。要检查空白字符串(不包括 '0')

<?php
// PHP < 8.0
if (!strlen($text)) {
echo
'Blank';
}

// PHP >= 8.0
if ($text === null || $text === '')) {
echo
'empty';
}
25
vcardillo at gmail dot com
12 年前
我想说明您需要不止这个函数才能真正测试空字符串。原因是 <?php strlen(null); ?> 将返回 0。那么您如何知道该值是 null,还是真正的空字符串呢?

<?php
$foo
= null;
$len = strlen(null);
$bar = '';

echo
"长度: " . strlen($foo) . "<br>";
echo
"长度: $len <br>";
echo
"长度: " . strlen(null) . "<br>";

if (
strlen($foo) === 0) echo '空长度为零 <br>';
if (
$len === 0) echo '空长度仍然为零 <br>';

if (
strlen($foo) == 0 && !is_null($foo)) echo '!is_null(): $foo 确实是一个空字符串 <br>';
else echo
'!is_null(): $foo 可能为 null <br>';

if (
strlen($foo) == 0 && isset($foo)) echo 'isset(): $foo 确实是一个空字符串 <br>';
else echo
'isset(): $foo 可能为 null <br>';

if (
strlen($bar) == 0 && !is_null($bar)) echo '!is_null(): $bar 确实是一个空字符串 <br>';
else echo
'!is_null(): $foo 可能为 null <br>';

if (
strlen($bar) == 0 && isset($bar)) echo 'isset(): $bar 确实是一个空字符串 <br>';
else echo
'isset(): $foo 可能为 null <br>';
?>

// 输出开始
长度: 0
长度: 0
长度: 0

空长度为零
空长度仍然为零

!is_null(): $foo 可能为 null
isset(): $foo 可能为 null

!is_null(): $bar 确实是一个空字符串
isset(): $bar 确实是一个空字符串
// 输出结束

所以,如果您关心原始值是否为 null,那么除了 strlen() 之外,您还需要使用 is_null() 或 isset()。
21
basil at gohar dot us
14 年前
我们刚刚遇到了一个我们认为是 bug 的问题,但事实证明这是 PHP 5.2 和 5.3 之间行为的已记录差异。 以下代码示例:

<?php

$attributes
= array('one', 'two', 'three');

if (
strlen($attributes) == 0 && !is_bool($attributes)) {
echo
"我们是在 'if' 中\n"; // PHP 5.3
} else {
echo
"我们是在 'else' 中\n"; // PHP 5.2
}

?>

这是因为在 5.2 中,strlen 会自动将传递给它的任何内容强制转换为字符串,将数组强制转换为字符串会生成字符串 "Array"。 在 5.3 中,这种情况发生了变化,如 5.3 中向后不兼容的更改中的以下要点所述 (https://php.net/manual/en/migration53.incompatible.php)

"较新的内部参数解析 API 已应用于 PHP 5.3.x 中捆绑的所有扩展。 此参数解析 API 使函数在传递不兼容的参数时返回 NULL。 此规则有一些例外,例如 get_class() 函数,它将在出错时继续返回 FALSE。"

因此,在 PHP 5.3 中,strlen($attributes) 返回 NULL,而在 PHP 5.2 中,strlen($attributes) 返回整数 5。 这可能会影响其他函数,因此如果您突然遇到不同的行为或新的 bug,请检查您是否已升级到 5.3(我们最近升级了),然后检查日志中是否有类似以下的警告

strlen() expects parameter 1 to be string, array given in /var/www/sis/lib/functions/advanced_search_lib.php on line 1028

如果是这样,那么您很可能正在遇到这种行为变化。
7
John
7 年前
这里有很多错误信息,我想要纠正! 许多人警告不要使用 strlen(),因为它“超级慢”。 嗯,这在旧版本的 PHP 中可能是真的。 但是从 PHP7 开始,这绝对不再是事实。 它现在超级快!

我创建了一个 20,00,000 字节的字符串(约 20 兆字节),并在循环中迭代了一亿次。 每次循环迭代都对那个非常非常长的字符串进行新的 strlen()。

结果:对 20 兆字节字符串执行一亿次 strlen() 调用总共只花了 488 毫秒。 即使我使字符串变小或变大,strlen() 调用也没有变慢或变快。 strlen() 几乎是恒定时间的,超快的操作

所以 PHP7 要么将每个字符串的长度存储为一个字段,这样它就可以始终直接查找而无需计算字符。 或者它缓存 strlen() 的结果,直到字符串内容实际发生变化。 无论哪种方式,您现在永远不必再担心 strlen() 的性能了。 从 PHP7 开始,它超级快!

如果您想在您的机器上重现它,以下是如何完整的基准代码

<?php

$iterations
= 100000000; // 一亿
$str = str_repeat( '0', 20000000 );

// 基准循环和变量赋值以计算循环开销
$start = microtime(true);
for(
$i = 0; $i < $iterations; ++$i ) {
$len = 0;
}
$end = microtime(true);
$loop_elapsed = 1000 * ($end - $start);

// 在循环中对 strlen 进行基准测试
$len = 0;
$start = microtime(true);
for(
$i = 0; $i < $iterations; ++$i ) {
$len = strlen( $str );
}
$end = microtime(true);
$strlen_elapsed = 1000 * ($end - $start);

// 从 strlen() 速度计算中减去循环开销
$strlen_elapsed -= $loop_elapsed;

echo
"\n字符串长度: {$len}\n测试耗时: {$strlen_elapsed} 毫秒\n";

?>
To Top