Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   PHP (http://www.flasher.ru/forum/forumdisplay.php?f=20)
-   -   ereg-обрезание :) (http://www.flasher.ru/forum/showthread.php?t=49552)

PaWell 25.09.2003 21:51

ereg-обрезание :)
 
Помогите, пожалуйста написать такое регулярное выражение, которое находит в строке длинные слова, больше 20 знаков, и разбивает их пробелами.

Заранее благодарен за помощь!!!

kompadre 25.09.2003 22:23

Хм ... А зачем тебе ерег сдался ? Он же ресурсов до хвига и больше жрет!

Если школьное задание, то пожалуйста -

/([\w]{10})([\w]10,})/

заменяем на

/$1 $2/

лучше для этого дела использовать preg_replace

если не для школы ... то тогда напиши хвункцию сам. Без регов

PaWell 25.09.2003 23:05

2 kompadre:
А как твой совет до кучи собрать??? :)
Чот я с "/$1 $2/" не очень понял...
Напиши мне, пожалуйста, полностью preg_replace, который разбивает строку.

kompadre 26.09.2003 02:07

Я сам не очень-то в моих советах разбираюсь ... Но смотри, берем :

- первая часть регулярного выражения (одна штука). В простонародие это называется pattern (игла, то что мы исчем)
- вторая часть регулярного выражения (или replacement, то на что бум менять)
- string (стог, строка из которой бум менять)

так ...

в другую руку берем функцию
PHP код:

preg_replace($pattern, $replacement, $string); 

и подстовляем

должно получится что-то вроде

$replaced = preg_replace ("/([\w]{10})([\w]{10,})/", "$1 $2", $string);

По идеи это должно в слове (в котором 20 или больше букв) вставить пробел на 10-й букве. Хотя коряво это блин

* Прошу прощения, оказывается replacement-у не нужны косые!

Nirva 26.09.2003 10:36

$str = "строка товя оргромная с мегачем-то там таким, кстати, самое длинное. известное мне и частоупотребляемое слово - достопримечтальность";
$ar = explode($str," ");
foreach($ar as $curr)
{
$res .= wordwrap($curr,10," ",1)
}

PaWell 26.09.2003 16:41

2 kompadre:
Почти всё работает!!! :)
Если слово из 20 букв, то всё ок (скрипт его разбивает на два по 10 букв), а вот если слово из 40 букв, то выводит первое слово из 10 букв, а второе - из 30 :(
Тоесть после первого разбиения строки скрипт её дальше не смотрит :( Как это исправить???

2 Nirva:
$res возвращает пустое значение :(
Почему???

kompadre 26.09.2003 17:09

Это ни как не исправиш, говорю тебе никакних регов. Ворд врап, только нирва все нимного попутал

$res = wordwrap($str,10," ",1)

и все

nagash 26.09.2003 18:29

если так принципиально это сделать регом тогда вот так

PHP код:

$a = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb ccccccccccccccccccccccccccccccc";
$a = preg_replace("/(\w{10})/", "$1 ", $a);
echo 
$a; 

только тут надо отметить один момент... прег реплейс надо самому себе приравнивать...
если написать
$b = preg_replace("/(\w{10})/", "$1 ", $a);
тогда $b не изменится...
надо именно
$a = preg_replace("/(\w{10})/", "$1 ", $a);

удачи...

kompadre 26.09.2003 19:19

Здесь вынужден согласиться

Nirva 26.09.2003 20:14

Цитата:

Оригинал написал(а) kompadre
Это ни как не исправиш, говорю тебе никакних регов. Ворд врап, только нирва все нимного попутал

$res = wordwrap($str,10," ",1)

и все

тогда просто расфигачишь всю строку по 10 символов на пробелы. щас....

PHP код:

<?
$str 
= "строка товя оргромная с мегачем-то там таким, кстати, самое длинное. известное мне и частоупотребляемое слово - достопримечтальность";
$ar = explode(" ",$str);
foreach(
$ar as $curr)
{
$res .= wordwrap($curr,10," ",1) ." ";
}
echo 
$res;
?>

работает. в прошлом ступил, конечно.

kompadre 26.09.2003 20:55

Нирва, дружище, ты не прав :)

copy & paste & see

<?
$str = "строка товя оргромная с мегачем-то там таким, кстати, самое длинное. известное мне и частоупотребляемое слово - достопримечтальность";
$res .= wordwrap($curr,10," ",1);
echo $res;
?>

Результат должен быть приссерно таким :

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

Если слово меньше максимума, вордврап его трогать не будет

Crazy 26.09.2003 21:58

Hint: правильная реализация должна основываться на двух константах: m=максимальная допустимая длина слова и n=размер нарезаемого куска. А совсем хорошо -- если будет еще и k=минимальный размер нарезаемого куска.

Так что все приведенные варианты можно рассматривать только как вариант на черный день...

Nirva 26.09.2003 22:17

2крейзи и компадре:
стойте-ка стойте-ка.

Цитата:

находит в строке длинные слова, больше 20 знаков, и разбивает их пробелами.
было так ведь, верно?
длинные слова находит? (ну всем понятно что 10 можно поменять на 20). находит.
пробелами разбивает? разбивает. ich verstehen euch nicht.
что не так?

Crazy 26.09.2003 22:38

m=20 :)

Осталось добавить n и k. :)

kompadre 26.09.2003 23:23

Да нет, все так ... Просто не совсем правильно как мне кажиться ...

зачем перегружать машину излишними explod-ами (представляеш какой массив может получиться если текст большой) и foreacham-и если тот код который написал я зделает то же самое что и твой ? :)

Nirva 26.09.2003 23:42

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

мне теперь не это интересно... мнев от что интересно - ход мыслей крейзи. пояснишь?

Crazy 26.09.2003 23:52

Цитата:

Оригинал написал(а) Nirva
мне теперь не это интересно... мнев от что интересно - ход мыслей крейзи. пояснишь?
Постулат 1. Чем реже мы рвем слова -- тем лучше. Ибо разорванные слова труднее прочесть.

Вывод: рвем только слова длинее m. Т.е. m -- длина, при которой слово мы никак не может оставить целым.

Постулат 2. Если мы уже решили рвать слово, то лучше разбивать его на куски удобного размера. Поскольку m -- максимум, то n (максимальная длина куска) будет меньше m.

Постулат 3. При разбивке от конаца слова могут отрезаться 1-3 буквы, что некузяво. Следовательно, стоит указать k, задающее минимальный размер куска.

Значения, которые кажутся мне разумными:

m=25
n=15
k=4

kompadre 27.09.2003 00:11

Нирва
Блин ! И опять мы про воздух ...

Ты посмотрел код который я предлагал ? Где там регексп ?Ты его запустил ?

Ребята, конечно хорошо все константами определять, но и оптимизировать нада ...

Единственный способ который я вижу сделать то что крэйзи предлогает это цикл в котором будем вырезать по букве (!!!) субстр-ом и вставлять в новую строку (добовляя пробел если смежных букв слишком много ) ... пока старая не закончиться.

Это же итераций будет сколько букв!

Wordwrap специально создан для того что хочет афтор топика (помоему) ... Не надо морочиться . Просто принять как факт.

kompadre 27.09.2003 00:24

ЗЫ про константы ...
просто вместо 10 поставить более удобное число ... скажем 15 как крэйзи правильно заметил

Nirva 27.09.2003 00:26

компадре:
<?
$str = "строка товя оргромная с мегачем-то там таким, кстати, самое длинное. известное мне и частоупотребляемое слово - достопримечтальность";
$res .= wordwrap($curr,10," ",1);
echo $res
?>
ты про это? ну переменной с именем curr не существует, черт с ним, забыл. аа... тьфу ты, ну да, конечно. я прогнал. не пользовался вордврапом давно =) да, верно.

итак, мы имеем: либо быструю функцию приведенную выше (не забыть исправть curr на str) или то, что предлагает крейзи, - придется писать дольше и процесс будет длиннее. Вывод: делаем первый случай или раз это оочень важно делаем второй. Все зависит от того, что используется в качестве строки.

Crazy 27.09.2003 09:03

Цитата:

Оригинал написал(а) kompadre
Wordwrap специально создан для того что хочет афтор топика
Да. Но создан криво. Настолько криво, что пользоваться им можно только от полной безысходности.

Nirva 27.09.2003 10:49

поясни, крейзи, убдь добр

kompadre 27.09.2003 10:49

Криво ? Интересно ...

После длительного анализа постулатов 1, 2, 3 (постулаты правильные) паралельно проанализируем-ка постулат который стоял перед разроботчиками ПХП - разбить большие слова дабы они не ломали ХТМЛь оформление.

Пример на верху - текстареа в которую помещаеться максимум 10 букв. Что делать ? Разбить большие слова на маленькие. Вопрос стоит - "где бить" ?

Самый быстрый вариант - разбить "in fraganti" - где видим буквы вместе больше максимума, там и режим . Но чем это кривее чем разбить учитывая все константы ? Все равно слово битое получаеться, как не крути. Да и читаться лучше будет. Читатель не подсознательно привыкает к правилам оформления. Вот и привыкнек врапу после 10 букв подряд. А в твоем варианте врап будет вылезать визально "где попало".

Или я опять недопонял ?

Покажи альтернативу, напиши функцию врапа со всеми постулатами.

Crazy 27.09.2003 13:59

Цитата:

Оригинал написал(а) kompadre
Покажи альтернативу, напиши функцию врапа со всеми постулатами.
Легко:

PHP код:

<?php

define
('MAX_WORD_LEN',21);
define('MAX_PART_LEN',15);
define('MIN_PART_LEN',4);

function 
split_long_words($text) {
  return 
preg_replace_callback('/([^ \t\r\n-]{'.MAX_WORD_LEN.',})/','_split_long_word',$text);
}

function 
_split_long_word($matched) {
  
$word = $matched[1];
  
$temp = '';
  
$charsLeft = strlen($word);
  
$offset = 0;
  while (
$charsLeft>0) {
    if (
$charsLeft>MAX_PART_LEN)
      if (
$charsLeft-MAX_PART_LEN>=MIN_PART_LEN)
        
$partLen = MAX_PART_LEN;
      else
        
$partLen = $charsLeft-MIN_PART_LEN;
    else
      
$partLen = $charsLeft;
    
$temp .= ' '.substr($word,$offset,$partLen);
    
$offset += $partLen;
    
$charsLeft -= $partLen;
  }
  return 
substr($temp,1);
}

$text = "дизоксирибонуклеиновая кислота";

$text1 = split_long_words($text);

echo 
"\n--------------\n$text1";

$text2 = wordwrap($text,MAX_WORD_LEN," ",1);

echo 
"\n--------------\n$text2";

?>

Выдача:

Код:

--------------
дизоксирибонукл еиновая кислота
--------------
дизоксирибонуклеинова я кислота

Отрыв одиночной буквы -- однозначно хуже, чем оторвать фрагмент заметного размера.

Далее: за 10 минут можно научить скрипт находить сравнительно удобные места для резки, чтобы результат меньше царапал ухо. Но обычно сие не требуется.

Nirva 27.09.2003 14:29

*офигел, слов нет*

kompadre 27.09.2003 18:07

Хорошо

nagash 27.09.2003 18:42

=)


Часовой пояс GMT +4, время: 18:14.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.