|
Обрезание строки
|
| Автор |
Сообщение |
[LP]LordPro.teus Призрак Лорда


Зарегистрирован: 26.07.2007 Сообщения: 5092
42282 
|
Добавлено: Вт, 08 Янв, 2008 16:52 Заголовок сообщения: Обрезание строки |
|
|
Как сделать функцию, которая бы:
- проверяла, превышает ли текстовая составляющая строки n символов;
- если строка содержит кириллические символы (или лучше, нелатинские) удваивала лимит n и проводила проверку, превышает ли строка его после этого;
- если превышает, обрезала строку до этих n символов;
Проблема в том, что строка может содержать HTML-теги, но они в длину учитываться не должны
Вторая проблема - не понятно, что делать, если строка содержит и латинские символы, и нет...
Причина, почему нельзя просто вырезать теги и проверить длину+провести обрезку строки - кириллица и прочие нелат. символы в Юникод занимают 2 байта... в то время, как пробелы и лат. символы - один байт... _________________

До выхода LiteDiary 0.3.0: парам-пам-пам-пам! Она уже здесь! |
|
| Вернуться к началу |
|
 |
lazutov while (1==1);


Зарегистрирован: 30.04.2007 Сообщения: 3840
111220 
|
|
| Вернуться к началу |
|
 |
[LP]LordPro.teus Призрак Лорда


Зарегистрирован: 26.07.2007 Сообщения: 5092
42282 
|
Добавлено: Вт, 08 Янв, 2008 18:03 Заголовок сообщения: |
|
|
Но ведь в таком случае при строке в, допустим, 10к символов (более чем реально) производительность будет... секунд 10 работать будет? _________________

До выхода LiteDiary 0.3.0: парам-пам-пам-пам! Она уже здесь! |
|
| Вернуться к началу |
|
 |
lazutov while (1==1);


Зарегистрирован: 30.04.2007 Сообщения: 3840
111220 
|
|
| Вернуться к началу |
|
 |
[LP]LordPro.teus Призрак Лорда


Зарегистрирован: 26.07.2007 Сообщения: 5092
42282 
|
Добавлено: Вт, 08 Янв, 2008 19:16 Заголовок сообщения: |
|
|
lazutov
нет, не срочно, буду очень благодарен... пробовал сам, но результат постоянно выходит некорректным... самый простой признак - кирилл.символ обрезается по половине, из-за чего вылазит что-то совсем непонятное..( _________________

До выхода LiteDiary 0.3.0: парам-пам-пам-пам! Она уже здесь! |
|
| Вернуться к началу |
|
 |
lazutov while (1==1);


Зарегистрирован: 30.04.2007 Сообщения: 3840
111220 
|
|
| Вернуться к началу |
|
 |
[LP]LordPro.teus Призрак Лорда


Зарегистрирован: 26.07.2007 Сообщения: 5092
42282 
|
Добавлено: Вт, 08 Янв, 2008 19:43 Заголовок сообщения: |
|
|
Сообщение, введенное пользователем, содержащее переводы строк (то есть, в <br/> перевода еще не произошло) и может содержать html-теги... _________________

До выхода LiteDiary 0.3.0: парам-пам-пам-пам! Она уже здесь! |
|
| Вернуться к началу |
|
 |
Alek$ 11 1110 1000


Зарегистрирован: 24.11.2007 Сообщения: 1136 Откуда: Новосибирск 26695 
|
Добавлено: Ср, 09 Янв, 2008 06:47 Заголовок сообщения: |
|
|
На коленке набросал вот такое, но не проверял:
| Код: |
function check_str($str, $n)
{
if(preg_match('/[А-Яа-я]/',$str))
$n *= 2;
if(strlen($str)<$n)
{
$str = substr(0, $n, $str);
}
return $str;
}
|
Я так понял, функция предназначена для работы с юникодом? _________________ Самая страшная ошибка - это ошибка без видимых причин и конкретных последствий.
phpBB3 [db_update.php generator]
phpBB3 [Russian]
Антисоциальный блог |
|
| Вернуться к началу |
|
 |
[LP]LordPro.teus Призрак Лорда


Зарегистрирован: 26.07.2007 Сообщения: 5092
42282 
|
Добавлено: Ср, 09 Янв, 2008 11:41 Заголовок сообщения: |
|
|
Alek$
да, с ним, я ее написал точно так же, но она тогда учитывает длину и тегов, и пробельных символов - следовательно, при определенном их числе снова будет получен обрезанный символ  _________________

До выхода LiteDiary 0.3.0: парам-пам-пам-пам! Она уже здесь! |
|
| Вернуться к началу |
|
 |
Roma-i-alena 11 1110 1000


Зарегистрирован: 03.05.2007 Сообщения: 1133 Откуда: vladimir 6191 
|
Добавлено: Ср, 09 Янв, 2008 12:28 Заголовок сообщения: |
|
|
Мне кажеться порядок такой:
1. Сначала надо вычленить чистый текст от тегов.
2. Затем провести необходимые действия (в нашем случае, проверка длинны и наличия латиницы)
3. Затем поставить текст (если необходимо, то урезаный до нужно длинный) в тэги. _________________ Жизнь никогда не заканчивается!!!
На то, собственно говоря, она и ЖИЗНЬ...
____________________________________
http://www.coderun.ru - Блог человека |
|
| Вернуться к началу |
|
 |
[LP]LordPro.teus Призрак Лорда


Зарегистрирован: 26.07.2007 Сообщения: 5092
42282 
|
Добавлено: Ср, 09 Янв, 2008 12:36 Заголовок сообщения: |
|
|
Roma-i-alena
с третьим действием сложновато... кроме того, нужно каким-то образом вычленить И пробелы, И латиницу, И символы вроде "/", ",", "." и т.д. - но вычленяя эти три группы мы должны отнимать (еще до удвоения лимита) по 1 за символ - так как они однобайтовые... тогда, по идее, у нас должна остаться только строка 2-байтовых символов...
Если честно, ума не приложу как это все сделать так, чтобы оно не сожрало ресурсов больше, чем это себе позволяет весь движок в целом... _________________

До выхода LiteDiary 0.3.0: парам-пам-пам-пам! Она уже здесь! |
|
| Вернуться к началу |
|
 |
Alek$ 11 1110 1000


Зарегистрирован: 24.11.2007 Сообщения: 1136 Откуда: Новосибирск 26695 
|
|
| Вернуться к началу |
|
 |
[LP]LordPro.teus Призрак Лорда


Зарегистрирован: 26.07.2007 Сообщения: 5092
42282 
|
Добавлено: Ср, 09 Янв, 2008 13:06 Заголовок сообщения: |
|
|
Alek$
тестировал на localhost - расширение mbstring отсутствует... хотя и согласен, было бы оправданнее обрезать это все с учетом кодировки, как работает это расширение _________________

До выхода LiteDiary 0.3.0: парам-пам-пам-пам! Она уже здесь! |
|
| Вернуться к началу |
|
 |
girafenok Два пингвиненка


Зарегистрирован: 17.11.2007 Сообщения: 333
11827 
|
Добавлено: Ср, 09 Янв, 2008 16:06 Заголовок сообщения: |
|
|
| Код: | | preg_split("/.{60}/u",$str) |
возвращает массив подстрок длиной 60 симоволов каждая строки $str с учетом utf-8 кодировки (буква u в шаблоне регулярного выражения).
Не проверял, но должно работать.
Для того, чтобы не учитывались html-теги надо модифицировать шаблон регулярного выражения, осталось сообразить как . |
|
| Вернуться к началу |
|
 |
|