PHP 5.6.0 released

mb_substr

(PHP 4 >= 4.0.6, PHP 5)

mb_substr文字列の一部を得る

説明

string mb_substr ( string $str , int $start [, int $length = NULL [, string $encoding = mb_internal_encoding() ]] )

文字数に基づきマルチバイト対応の substr() 処理を行います。位置は、 str の始めから数えられます。 最初の文字の位置は 0、2 番目の文字の位置は 1、といったようになります。

パラメータ

str

部分文字列を取り出したい文字列。

start

str の中から最初に取り出す文字の位置。

length

str の中から取り出す最大文字数。 省略したり NULL を渡したりした場合は、 文字列の最後までの全バイトを取り出します。

encoding

encoding パラメータには文字エンコーディングを指定します。省略した場合は、 内部文字エンコーディングを使用します。

返り値

mb_substr() は、start および length パラメータで指定した str の一部を返します。

参考

add a note add a note

User Contributed Notes 10 notes

up
17
Silvan
7 years ago
Passing null as length will not make mb_substr use it's default, instead it will interpret it as 0.
<?php
mb_substr
($str,$start,null,$encoding); //Returns '' (empty string) just like substr()
?>
Instead use:
<?php
mb_substr
($str,$start,mb_strlen($str),$encoding);
?>
up
7
qeremy [atta] gmail [dotta] com
2 years ago
A proper (logical) alternative for unicode strings;

<?php
function substr_unicode($str, $s, $l = null) {
    return
join("", array_slice(
       
preg_split("//u", $str, -1, PREG_SPLIT_NO_EMPTY), $s, $l));
}

$str = "Büyük";
$s = 0; // start from "0" (nth) char
$l = 3; // get "3" chars
echo substr($str, $s, $l) ."\n";    // Bü
echo mb_substr($str, $s, $l) ."\n"; // Bü
echo substr_unicode($str, $s, $l);  // Büy
?>
up
3
Anonymous
4 years ago
If start  is negative, the returned string will start at the start'th character from the end of string
up
1
projektas at gmail dot com
5 years ago
First letter in upper case <hr />

<?php
header
('Content-type: text/html; charset=utf-8');

if (isset(
$_POST['check']) && !empty($_POST['check'])) {
    echo
htmlspecialchars(ucfirst_utf8($_POST['check']));
} else {
    echo
htmlspecialchars(ucfirst_utf8('Žąsinų'));
}

function
ucfirst_utf8($str) {
    if (
mb_check_encoding($str,'UTF-8')) {
       
$first = mb_substr(
           
mb_strtoupper($str, "utf-8"),0,1,'utf-8'
       
);
        return
$first.mb_substr(
           
mb_strtolower($str,"utf-8"),1,mb_strlen($str),'utf-8'
       
);
    } else {
        return
$str;
    }
}
?>

<form method="post" action="" >
    <input type="input" name="check" />
    <input type="submit" />
</form>
up
1
p dot assenov at aip-solutions dot com
2 years ago
I'm trying to capitalize only the first character of the string and tried some of the examples above but they didn't work. It seems mb_substr() cannot calculate the length of the string in multi-byte encoding (UTF-8) and it should be set explicitly. Here is the corrected version:

<?php
function mb_ucfirst($str, $enc = 'utf-8') {
    return
mb_strtoupper(mb_substr($str, 0, 1, $enc), $enc).mb_substr($str, 1, mb_strlen($str, $enc), $enc);
}
?>

cheers!
up
0
levani9191 at gmail dot com
4 years ago
A simple code that check if the latest symbol in the string is a question mark and adds one if it doesn't...

<?php $string = (mb_substr($string, -1, 1, 'UTF-8') != '?') ? $string.'?' : $string; ?>
up
0
xiaogil at yahoo dot fr
9 years ago
Thanks Darien from /freenode #php for the following example (a little bit changed).

It just prints the 6th character of $string.
You can replace the digits by the same in japanese, chinese or whatever language to make a test, it works perfect.

<?php
mb_internal_encoding
("UTF-8");
$string = "0123456789";
$mystring = mb_substr($string,5,1);
echo
$mystring;
?>

(I couldn't replace 0123456789 by chinese numbers for example here, because it's automatically converted into latin digits on this website, look :
&#38646;&#19968;&#20108;&#19977;&#22235;
&#20116;&#20845;&#19971;&#20843;&#20061;)

gilv
up
0
drraf at tlen dot pl
9 years ago
Note: If borders are out of string - mb_string() returns empty _string_, when function substr() returns _boolean_ false in this case.
Keep this in mind when using "===" comparisions.

Example code:
<?php

var_dump
( substr( 'abc', 5, 2 ) ); // returns "false"
var_dump( mb_substr( 'abc', 5, 2 ) ); // returns ""

?>

It's especially confusing when using mbstring with function overloading turned on.
up
-1
desmatic at gmail dot com
1 year ago
quick and dirty loop through multibyte string
<?php
function get_character_classes($string, $encoding = "UTF-8") {
   
$current_encoding = mb_internal_encoding();
   
mb_internal_encoding($encoding);
   
$has = array();
   
$stringlength = mb_strlen($string, $encoding);
    for (
$i=0; $i < $stringlength; $i++) {
       
$c = mb_substr($string, $i, 1);
        if ((
$c >= "0") && ($c <= "9")) {
           
$has['numeric'] = "numeric";
        } else if ((
$c >= "a") && ($c <= "z")) {
           
$has['alpha'] = "alpha";
           
$has['alphalower'] = 'alphalower';
        } else if ((
$c >= "A") && ($c <= "Z")) {
           
$has['alpha'] = "alpha";
           
$has['alphaupper'] = "alphaupper";
        } else if ((
$c == "$") || ($c == "£")) {
           
$has['currency'] = "currency";
        } else if ((
$c == ".") && ($has['decimal'])) {
           
$has['decimals'] = "decimals";
        } else if (
$c == ".") {
           
$has['decimal'] = "decimal";
        } else if (
$c == ",") {
           
$has['comma'] = "comma";
        } else if (
$c == "-") {
           
$has['dash'] = "dash";
        } else if (
$c == " ") {
           
$has['space'] = "space";
        } else if (
$c == "/") {
           
$has['slash'] = "slash";
        } else if (
$c == ":") {
           
$has['colon'] = "colon";
        } else if ((
$c >= " ") && ($c <= "~")) {
           
$has['ascii'] = "ascii";
        } else {
           
$has['binary'] = "binary";
        }
    }
   
mb_internal_encoding($current_encoding);
   
    return
$has;
}

$string = "1234asdfA£^_{}|}~žščř";
echo
print_r(get_character_classes($string), true);
?>

Array
(
    [numeric] => numeric
    [alpha] => alpha
    [alphalower] => alphalower
    [alphaupper] => alphaupper
    [currency] => currency
    [ascii] => ascii
    [binary] => binary
)
up
-1
sanjuro at 1up-games dot com
11 months ago
A serious pitfall when using mb_substr() set to HTML-ENTITIES encoding is that the function performs a number of conversions before returning the value, the worst one being that html special characters are not just counted but decoded.

<?php

mb_internal_encoding
("ISO-8859-1"); echo mb_internal_encoding(),"\n<br><br>\n";

$a='j&uuml;st &#228; &quot; simple &quot; &#26085;&#26412; &lt;b&gt;test&lt;/b&gt;';

echo
mb_substr($a,0),"\n<br><br>\n";
// page source: j&uuml;st &#228; &quot; simple &quot; &#26085;&#26412; &lt;b&gt;test&lt;/b&gt;

echo mb_substr($a,0,strlen($a),'HTML-ENTITIES');
// page source: j&uuml;st &auml; " simple " &#26085;&#26412; <b>test</b>

?>
To Top