SunshinePHP Developer Conference 2015

mb_substr

(PHP 4 >= 4.0.6, PHP 5)

mb_substrGet part of string

Beschreibung

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

Performs a multi-byte safe substr() operation based on number of characters. Position is counted from the beginning of str. First character's position is 0. Second character position is 1, and so on.

Parameter-Liste

str

The string to extract the substring from.

start

Position of first character to use from str.

length

Maximum number of characters to use from str. If omitted or NULL is passed, extract all characters to the end of the string.

encoding

Der encoding Parameter legt das Zeichenencoding fest. Wird er nicht übergeben so wird das interne Zeichenencoding genutzt.

Rückgabewerte

mb_substr() returns the portion of str specified by the start and length parameters.

Siehe auch

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
1 year 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