Here is my solution to highlighting search queries in multibyte text:
<?php
function mb_highlight($data, $query, $ins_before, $ins_after)
{
$result = '';
while (($poz = mb_strpos(mb_strtolower($data), mb_strtolower($query))) !== false)
{
$query_len = mb_strlen ($query);
$result .= mb_substr ($data, 0, $poz).
$ins_before.
mb_substr ($data, $poz, $query_len).
$ins_after;
$data = mb_substr ($data, $poz+$query_len);
}
return $result;
}
?>
Enjoy!
[EDIT BY danbrown AT php DOT net: Reclassified to a more appropriate function manual page.]
mb_substr
(PHP 4 >= 4.0.6, PHP 5)
mb_substr — Get part of string
Description
string mb_substr
( string $str
, int $start
[, int $length
[, string $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.
Parameters
- str
-
The string being checked.
- start
-
The first position used in str .
- length
-
The maximum length of the returned string.
- encoding
-
The encoding parameter is the character encoding. If it is omitted, the internal character encoding value will be used.
Return Values
mb_substr() returns the portion of str specified by the start and length parameters.
See Also
- mb_strcut() - Get part of string
- mb_internal_encoding() - Set/Get internal character encoding
mb_substr
dziamid at gmail dot com
06-Feb-2009 02:27
06-Feb-2009 02:27
projektas at gmail dot com
21-Oct-2008 11:29
21-Oct-2008 11:29
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>
Silvan
01-Sep-2007 08:30
01-Sep-2007 08:30
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);
?>
xiaogil at yahoo dot fr
02-Aug-2005 01:33
02-Aug-2005 01:33
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 :
零一二三四
五六七八九)
gilv
drraf at tlen dot pl
23-Feb-2005 12:44
23-Feb-2005 12:44
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.
