PHP Conference Japan 2024

strlen

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

strlen取得字串長度

說明

strlen(字串 $string): 整數

返回給定 string 的長度。

參數

string

被測量長度的 字串

回傳值

string 的長度,以位元組為單位。

範例

範例 #1 strlen() 範例

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

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

注意事項

備註:

strlen() 傳回的是字串的位元組數,而不是字元數。

參見

新增備註

使用者提供的備註 7 則備註

rm dot nasir at hotmail dot com
8 年前
我想與使用 UTF8 編碼字串或使用阿拉伯語、波斯語、普什圖語、達利語、簡體中文、繁體中文、日語、越南語、烏爾都語、馬其頓語、立陶宛語等語言的 PHP 新手或初學者分享一些非常重要的資訊。
如同手冊所述:「strlen() 傳回的是字串的位元組數,而不是字元數。」,因此,如果您想取得 UTF8 字串的字元數,請使用 mb_strlen() 而不是 strlen()。

範例

<?php
// 下方的阿拉伯語(你好)字串為:59 個位元組和 32 個字元
$utf8 = "السلام علیکم ورحمة الله وبرکاته!";

var_export( strlen($utf8) ); // 59
echo "<br>";
var_export( mb_strlen($utf8, 'utf8') ); // 32
?>
joeri at sebrechts dot net
8 年前
檢查長度以確保值符合資料庫欄位時,請注意使用正確的函式。

有三種可能的情況

1. 最可能的情況:資料庫欄位是 UTF-8 編碼,長度以 Unicode 字碼點定義(例如,UTF-8 資料庫的 mysql varchar(200))。

<?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),而不是程式碼點 (code point)
?>

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.dev.org.tw/manual/en/mbstring.supported-encodings.php
mb_strlen($value, $charset);
// 可行,支援的字元集:https://gnu.dev.org.tw/software/libiconv/
iconv_strlen($value, $charset);
?>
jasonrohrer at fastmail dot fm
11 年前
PHP 的 strlen 函式在處理空位元組 ('\0') 方面與 C 的 strlen 函式行為不同。

在 PHP 中,字串中的空位元組不會被視為字串的結尾,任何空位元組都會被包含在字串的長度計算中。

例如,在 PHP 中

strlen( "te\0st" ) = 5

在 C 中,相同的呼叫會返回 2。

因此,PHP 的 strlen 函式可以用來計算二進位字串中的位元組數(例如,base64_decode 返回的二進位資料)。
Daniel Klein
2 年前
自 PHP 8.0 起,將 null 傳遞給 strlen() 已被棄用。要檢查空字串(不包含 '0')

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

// PHP >= 8.0
if ($text === null || $text === '')) {
echo
'空';
}
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 'Null 的長度是零 <br>';
if (
$len === 0) echo 'Null 的長度仍然是零 <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

Null 的長度是零
Null 的長度仍然是零

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

!is_null(): $bar 是真正的空字串
isset(): $bar 是真正的空字串
// 輸出結束

因此,如果您在意原始值是否為 null,除了 strlen() 之外,似乎還需要 is_null() 或 isset()。
basil at gohar dot us
14 年前
我們剛遇到一個我們認為是錯誤的問題,但結果證明是 PHP 5.2 和 5.3 之間記錄在案的行為差異。以下列程式碼為例

<?php

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

if (
strlen($attributes) == 0 && !is_bool($attributes)) {
echo
"We are in the 'if'\n"; // PHP 5.3
} else {
echo
"We are in the 'else'\n"; // PHP 5.2
}

?>

這是因為在 5.2 版本中,strlen() 會自動將傳入的任何值轉換為字串,而將陣列轉換為字串會產生字串 "Array"。在 5.3 版本中,這點做了更改,如 5.3 版本不相容變更中的以下幾點所示(https://php.dev.org.tw/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。這可能會影響其他函式,因此如果您突然發現不同的行為或新的錯誤,請檢查您是否已升級到 5.3(我們最近升級了),然後檢查您的紀錄檔中是否有類似以下的警告

strlen() 需要參數 1 為字串,在 /var/www/sis/lib/functions/advanced_search_lib.php 的第 1028 行給定的是陣列

如果是這樣,那麼您可能遇到了這種行為變更。
John
7 年前
這裡有很多錯誤資訊,我想更正一下!許多人警告不要使用 strlen(),因為它「超級慢」。嗯,這在舊版本的 PHP 中可能是真的。但從 PHP7 開始,這絕對不再是事實。它現在超級快!

我建立了一個 20,000,000 位元組的字串(約 20 MB),並在迴圈中迭代了一億次。每次迴圈迭代都會對那個非常非常長的字串執行一次新的 strlen()。

結果:在一個 20 MB 的字串上呼叫一億次 strlen() 只花了 488 毫秒。即使我將字串變小或變大,strlen() 呼叫的速度也沒有變慢/變快。 strlen() 幾乎是一個恆數時間的超快速操作

所以,PHP7 要嘛將每個字串的長度儲存為一個欄位,它可以簡單地隨時查詢而無需計算字元。要嘛它會快取 strlen() 的結果,直到字串內容實際更改為止。無論哪種方式,您現在都不應該再擔心 strlen() 的效能。從 PHP7 開始,它超級快!

如果您想在您的機器上重現它,這裡是完整的基準測試程式碼

<?php

$iterations
= 100000000; // 1億
$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