utf-8 и string

Статус
В этой теме нельзя размещать новые ответы.

CrashX

В прошлом XSiteCMS
Регистрация
6 Июн 2008
Сообщения
682
Реакции
114
интересует замена функций
substr();
strrchr();
strlen();
и тп
использование библиотеки mb_string не катит, не в силу отсутствия на сервере, а из личных соображений

вот допустим
strlen
можно делать так
return count(preg_split("//iu", $str)) - 2;
как седать регуляркой перевод в другой регистр, образать до указанной длины
найти последнее в вхождение или обрезать до указанной длины с учетом пробела...
 
А чем тебе не нравится mb_spring?? Тем более что можно строковые функции не переписывать в скрипте а сделать им перезагрузку:
PHP:
ini_set('mbstring.internal_encoding', $ini->Getvar('Charset'));
ini_set('mbstring.func_overload', '7'); //1-email, 2-string, 4-regex
ini_set('mbstring.encoding_translation', '0');
ini_set('mbstring.http_input', 'pass');
ini_set('mbstring.http_output', 'pass');
ini_set('mbstring.detect_order', 'auto');
ini_set('mbstring.language', 'Neutral');
ini_set('mbstring.substitute_character', 'none');
Просто код рпазмести в начале скрипта, и str**** будут обрабатываться mb_****
 
как решение неплохо, но
"допустим" на сервере нет данного раширения, не спорю редкость... но все же

как сделать ре используюя mb_*
 
как решение неплохо, но
"допустим" на сервере нет данного раширения, не спорю редкость... но все же
как сделать ре используюя mb_*

Послать лесом того хостера и найти нормального, у которого есть элементарные вещи. Если там нет mb_string, то это плохой хостер, поскольку это вещь первой необходимости. А у плохого хостера косяки будут проявлятся и проявляться. Имел печальный опыт: то сейфмод включат не предупредив, то register_globals, то с "localhost" к БД перестало коннектиться "случайно"....

Так что оно тебе надо ??? Меняй не задумываясь, благо есть выбор.
 
то сейфмод включат не предупредив, то register_globals, то с "localhost" к БД перестало коннектиться "случайно".
Чтобы избегать зависимостей от подобных настроек хостинга - нужно программировать с проверками.
 
спасибо я все понимаю, у моего хостера есть все)
но это больше спортивынй интерес)))

function utf8_strlen($s)
{
return preg_match_all('/./u', $s, $tmp);
}

function utf8_substr($s, $offset, $len = 'all')
{
if ($offset<0) $offset = utf8_strlen($s) + $offset;
if ($len!='all')
{
if ($len<0) $len = utf8_strlen($s) - $offset + $len;
$xlen = utf8_strlen($s) - $offset;
$len = ($len>$xlen) ? $xlen : $len;
preg_match('/^.{' . $offset . '}(.{0,'.$len.'})/us', $s, $tmp);
}
else
{
preg_match('/^.{' . $offset . '}(.*)/us', $s, $tmp);
}
return (isset($tmp[1])) ? $tmp[1] : false;
}

function utf8_strpos($haystack, $needle, $offset = 0)
{
# get substring (if isset offset param)
$offset = ($offset<0) ? 0 : $offset;
if ($offset>0)
{
preg_match('/^.{' . $offset . '}(.*)/us', $haystack, $dummy);
$haystack = (isset($dummy[1])) ? $dummy[1] : '';
}

# get relative pos
$p = strpos($haystack, $needle);
if ($haystack=='' or $p===false) return false;
$r = $offset;
$i = 0;

# calc real pos
while($i<$p)
{
if (ord($haystack[$i])<128)
{
# ascii symbol
$i = $i + 1;
}
else
{
# non-ascii symbol with variable length
# (handling first byte)
$bvalue = decbin(ord($haystack[$i]));
$i = $i + strlen(preg_replace('/^(1+)(.+)$/', '\1', $bvalue));
}
$r++;
}
return $r;
}

function utf8_substr_count($h, $n)
{
# preparing $n for using in reg. ex.
$n = preg_quote($n, '/');

# select all matches
preg_match_all('/' . $n . '/u', $h, $dummy);
return count($dummy[0]);
}
 
Посмотрите в фреймворке Kohana в каталоге
kohana/system/utf-8
 
Я для обрезки строки до определённого количества символов использую свою самописную функцию:

PHP:
function utf8_substr($str,$from,$len,$pristavka="..."){
	return preg_replace('#^(?:[\x00-\x7F]|[\xC0-\xFF][\x80-\xBF]+){0,'.$from.'}'.
	'((?:[\x00-\x7F]|[\xC0-\xFF][\x80-\xBF]+){0,'.$len.'}).*#s',
	'$1'.$pristavka,$str);
}

Где str - наш текст, from — начало куска который надо оставить (порядковый номер символа в строке), $len - сколько символов оставить, $pristavka - что дописывать в конце (по умолчанию - ...)

Использование такое:

PHP:
$mytext = 'Этот текст я хочу обрезать до 20 символов';
echo utf8_substr($mytext,0,20,'...');

Результат:

Этот текст я хочу об...
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху