EOMY.NET
Хостинг EOMY.NET: Форум поддержки
 
 FAQFAQ   ПоискПоиск   ПользователиПользователи   ГруппыГруппы   РегистрацияРегистрация 
 ПрофильПрофиль   Войти и проверить личные сообщенияВойти и проверить личные сообщения   ВходВход 
RSS Feed  

Обрезание строки

 
Начать новую тему   Ответить на тему    Список форумов EOMY.NET -> Программирование для WEB
Обрезание строки
Автор Сообщение
[LP]LordPro.teus
Призрак Лорда
Призрак Лорда


Зарегистрирован: 26.07.2007
Сообщения: 5123

44732 Монеты

СообщениеДобавлено: Вт, 08 Янв, 2008 16:52    Заголовок сообщения: Обрезание строки Ответить с цитатой

Как сделать функцию, которая бы:
- проверяла, превышает ли текстовая составляющая строки n символов;
- если строка содержит кириллические символы (или лучше, нелатинские) удваивала лимит n и проводила проверку, превышает ли строка его после этого;
- если превышает, обрезала строку до этих n символов;

Проблема в том, что строка может содержать HTML-теги, но они в длину учитываться не должны Confused
Вторая проблема - не понятно, что делать, если строка содержит и латинские символы, и нет...
Причина, почему нельзя просто вырезать теги и проверить длину+провести обрезку строки - кириллица и прочие нелат. символы в Юникод занимают 2 байта... в то время, как пробелы и лат. символы - один байт...
_________________

А ведь еще не поздно смотаться на Азовское море, согреться на солнышке...
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
lazutov
while (1==1);
Последний герой


Зарегистрирован: 30.04.2007
Сообщения: 4429

120354 Монеты

СообщениеДобавлено: Вт, 08 Янв, 2008 17:57    Заголовок сообщения: Ответить с цитатой

можно проверить строку посимвольно.
_________________
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
[LP]LordPro.teus
Призрак Лорда
Призрак Лорда


Зарегистрирован: 26.07.2007
Сообщения: 5123

44732 Монеты

СообщениеДобавлено: Вт, 08 Янв, 2008 18:03    Заголовок сообщения: Ответить с цитатой

Но ведь в таком случае при строке в, допустим, 10к символов (более чем реально) производительность будет... секунд 10 работать будет?
_________________

А ведь еще не поздно смотаться на Азовское море, согреться на солнышке...
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
lazutov
while (1==1);
Последний герой


Зарегистрирован: 30.04.2007
Сообщения: 4429

120354 Монеты

СообщениеДобавлено: Вт, 08 Янв, 2008 19:13    Заголовок сообщения: Ответить с цитатой

если не срочно, я в выходные попробуюнаписать.
_________________
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
[LP]LordPro.teus
Призрак Лорда
Призрак Лорда


Зарегистрирован: 26.07.2007
Сообщения: 5123

44732 Монеты

СообщениеДобавлено: Вт, 08 Янв, 2008 19:16    Заголовок сообщения: Ответить с цитатой

lazutov
нет, не срочно, буду очень благодарен... пробовал сам, но результат постоянно выходит некорректным... самый простой признак - кирилл.символ обрезается по половине, из-за чего вылазит что-то совсем непонятное..(
_________________

А ведь еще не поздно смотаться на Азовское море, согреться на солнышке...
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
lazutov
while (1==1);
Последний герой


Зарегистрирован: 30.04.2007
Сообщения: 4429

120354 Монеты

СообщениеДобавлено: Вт, 08 Янв, 2008 19:29    Заголовок сообщения: Ответить с цитатой

а как получается эта строка, из чего читается?
_________________
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
[LP]LordPro.teus
Призрак Лорда
Призрак Лорда


Зарегистрирован: 26.07.2007
Сообщения: 5123

44732 Монеты

СообщениеДобавлено: Вт, 08 Янв, 2008 19:43    Заголовок сообщения: Ответить с цитатой

Сообщение, введенное пользователем, содержащее переводы строк (то есть, в <br/> перевода еще не произошло) и может содержать html-теги...
_________________

А ведь еще не поздно смотаться на Азовское море, согреться на солнышке...
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
Alek$
11 1110 1000
11 1110 1000


Зарегистрирован: 24.11.2007
Сообщения: 1140
Откуда: Новосибирск
26958 Монеты

СообщениеДобавлено: Ср, 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
Сообщения: 5123

44732 Монеты

СообщениеДобавлено: Ср, 09 Янв, 2008 11:41    Заголовок сообщения: Ответить с цитатой

Alek$
да, с ним, я ее написал точно так же, но она тогда учитывает длину и тегов, и пробельных символов - следовательно, при определенном их числе снова будет получен обрезанный символ Smile
_________________

А ведь еще не поздно смотаться на Азовское море, согреться на солнышке...
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
Roma-i-alena
11 1110 1000
11 1110 1000


Зарегистрирован: 03.05.2007
Сообщения: 1169
Откуда: vladimir
8115 Монеты

СообщениеДобавлено: Ср, 09 Янв, 2008 12:28    Заголовок сообщения: Ответить с цитатой

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


Зарегистрирован: 26.07.2007
Сообщения: 5123

44732 Монеты

СообщениеДобавлено: Ср, 09 Янв, 2008 12:36    Заголовок сообщения: Ответить с цитатой

Roma-i-alena
с третьим действием сложновато... кроме того, нужно каким-то образом вычленить И пробелы, И латиницу, И символы вроде "/", ",", "." и т.д. - но вычленяя эти три группы мы должны отнимать (еще до удвоения лимита) по 1 за символ - так как они однобайтовые... тогда, по идее, у нас должна остаться только строка 2-байтовых символов...
Если честно, ума не приложу как это все сделать так, чтобы оно не сожрало ресурсов больше, чем это себе позволяет весь движок в целом...
_________________

А ведь еще не поздно смотаться на Азовское море, согреться на солнышке...
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
Alek$
11 1110 1000
11 1110 1000


Зарегистрирован: 24.11.2007
Сообщения: 1140
Откуда: Новосибирск
26958 Монеты

СообщениеДобавлено: Ср, 09 Янв, 2008 12:55    Заголовок сообщения: Ответить с цитатой

[LP]LordPro.teus
А ты уверен, что такие жертвы оправданы? Может, не обрезать ее, эту строку?
Или воспользоваться расширением mbstring:
http://www.php.su/functions/?cat=mbstring
http://ru2.php.net/mbstring
_________________
Самая страшная ошибка - это ошибка без видимых причин и конкретных последствий.
phpBB3 [db_update.php generator]
phpBB3 [Russian]
Антисоциальный блог
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
[LP]LordPro.teus
Призрак Лорда
Призрак Лорда


Зарегистрирован: 26.07.2007
Сообщения: 5123

44732 Монеты

СообщениеДобавлено: Ср, 09 Янв, 2008 13:06    Заголовок сообщения: Ответить с цитатой

Alek$
тестировал на localhost - расширение mbstring отсутствует... хотя и согласен, было бы оправданнее обрезать это все с учетом кодировки, как работает это расширение
_________________

А ведь еще не поздно смотаться на Азовское море, согреться на солнышке...
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
girafenok
Два пингвиненка
Два пингвина


Зарегистрирован: 17.11.2007
Сообщения: 353

13058 Монеты

СообщениеДобавлено: Ср, 09 Янв, 2008 16:06    Заголовок сообщения: Ответить с цитатой

Код:
preg_split("/.{60}/u",$str)

возвращает массив подстрок длиной 60 симоволов каждая строки $str с учетом utf-8 кодировки (буква u в шаблоне регулярного выражения).
Не проверял, но должно работать.
Для того, чтобы не учитывались html-теги надо модифицировать шаблон регулярного выражения, осталось сообразить как Smile .
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
Показать сообщения:   
Начать новую тему   Ответить на тему    Список форумов EOMY.NET -> Программирование для WEB Часовой пояс: GMT
Страница 1 из 1

 


Rambler's Top100   Рейтинг@Mail.ru    



Powered by phpBB © 2001, 2005 phpBB Group