![]() |
ereg-обрезание :)
Помогите, пожалуйста написать такое регулярное выражение, которое находит в строке длинные слова, больше 20 знаков, и разбивает их пробелами.
Заранее благодарен за помощь!!! |
Хм ... А зачем тебе ерег сдался ? Он же ресурсов до хвига и больше жрет!
Если школьное задание, то пожалуйста - /([\w]{10})([\w]10,})/ заменяем на /$1 $2/ лучше для этого дела использовать preg_replace если не для школы ... то тогда напиши хвункцию сам. Без регов |
2 kompadre:
А как твой совет до кучи собрать??? :) Чот я с "/$1 $2/" не очень понял... Напиши мне, пожалуйста, полностью preg_replace, который разбивает строку. |
Я сам не очень-то в моих советах разбираюсь ... Но смотри, берем :
- первая часть регулярного выражения (одна штука). В простонародие это называется pattern (игла, то что мы исчем) - вторая часть регулярного выражения (или replacement, то на что бум менять) - string (стог, строка из которой бум менять) так ... в другую руку берем функцию PHP код:
должно получится что-то вроде $replaced = preg_replace ("/([\w]{10})([\w]{10,})/", "$1 $2", $string); По идеи это должно в слове (в котором 20 или больше букв) вставить пробел на 10-й букве. Хотя коряво это блин * Прошу прощения, оказывается replacement-у не нужны косые! |
$str = "строка товя оргромная с мегачем-то там таким, кстати, самое длинное. известное мне и частоупотребляемое слово - достопримечтальность";
$ar = explode($str," "); foreach($ar as $curr) { $res .= wordwrap($curr,10," ",1) } |
2 kompadre:
Почти всё работает!!! :) Если слово из 20 букв, то всё ок (скрипт его разбивает на два по 10 букв), а вот если слово из 40 букв, то выводит первое слово из 10 букв, а второе - из 30 :( Тоесть после первого разбиения строки скрипт её дальше не смотрит :( Как это исправить??? 2 Nirva: $res возвращает пустое значение :( Почему??? |
Это ни как не исправиш, говорю тебе никакних регов. Ворд врап, только нирва все нимного попутал
$res = wordwrap($str,10," ",1) и все |
если так принципиально это сделать регом тогда вот так
PHP код:
если написать $b = preg_replace("/(\w{10})/", "$1 ", $a); тогда $b не изменится... надо именно $a = preg_replace("/(\w{10})/", "$1 ", $a); удачи... |
Здесь вынужден согласиться
|
Цитата:
PHP код:
|
Нирва, дружище, ты не прав :)
copy & paste & see <? $str = "строка товя оргромная с мегачем-то там таким, кстати, самое длинное. известное мне и частоупотребляемое слово - достопримечтальность"; $res .= wordwrap($curr,10," ",1); echo $res; ?> Результат должен быть приссерно таким : строка товя оргромная с мегачем-то там таким, кстати, самое длинное. известное мне и частоупотр ебляемое слово - достоприме чтальность Если слово меньше максимума, вордврап его трогать не будет |
Hint: правильная реализация должна основываться на двух константах: m=максимальная допустимая длина слова и n=размер нарезаемого куска. А совсем хорошо -- если будет еще и k=минимальный размер нарезаемого куска.
Так что все приведенные варианты можно рассматривать только как вариант на черный день... |
2крейзи и компадре:
стойте-ка стойте-ка. Цитата:
длинные слова находит? (ну всем понятно что 10 можно поменять на 20). находит. пробелами разбивает? разбивает. ich verstehen euch nicht. что не так? |
m=20 :)
Осталось добавить n и k. :) |
Да нет, все так ... Просто не совсем правильно как мне кажиться ...
зачем перегружать машину излишними explod-ами (представляеш какой массив может получиться если текст большой) и foreacham-и если тот код который написал я зделает то же самое что и твой ? :) |
а прег реплейс знач в воздухе работает =)
да нет, я просто привел пример без регуляров. если бы у меня стояла такая задача я бы воспользовался ими. мне теперь не это интересно... мнев от что интересно - ход мыслей крейзи. пояснишь? |
Цитата:
Вывод: рвем только слова длинее m. Т.е. m -- длина, при которой слово мы никак не может оставить целым. Постулат 2. Если мы уже решили рвать слово, то лучше разбивать его на куски удобного размера. Поскольку m -- максимум, то n (максимальная длина куска) будет меньше m. Постулат 3. При разбивке от конаца слова могут отрезаться 1-3 буквы, что некузяво. Следовательно, стоит указать k, задающее минимальный размер куска. Значения, которые кажутся мне разумными: m=25 n=15 k=4 |
Нирва
Блин ! И опять мы про воздух ... Ты посмотрел код который я предлагал ? Где там регексп ?Ты его запустил ? Ребята, конечно хорошо все константами определять, но и оптимизировать нада ... Единственный способ который я вижу сделать то что крэйзи предлогает это цикл в котором будем вырезать по букве (!!!) субстр-ом и вставлять в новую строку (добовляя пробел если смежных букв слишком много ) ... пока старая не закончиться. Это же итераций будет сколько букв! Wordwrap специально создан для того что хочет афтор топика (помоему) ... Не надо морочиться . Просто принять как факт. |
ЗЫ про константы ...
просто вместо 10 поставить более удобное число ... скажем 15 как крэйзи правильно заметил |
компадре:
<? $str = "строка товя оргромная с мегачем-то там таким, кстати, самое длинное. известное мне и частоупотребляемое слово - достопримечтальность"; $res .= wordwrap($curr,10," ",1); echo $res ?> ты про это? ну переменной с именем curr не существует, черт с ним, забыл. аа... тьфу ты, ну да, конечно. я прогнал. не пользовался вордврапом давно =) да, верно. итак, мы имеем: либо быструю функцию приведенную выше (не забыть исправть curr на str) или то, что предлагает крейзи, - придется писать дольше и процесс будет длиннее. Вывод: делаем первый случай или раз это оочень важно делаем второй. Все зависит от того, что используется в качестве строки. |
Цитата:
|
поясни, крейзи, убдь добр
|
Криво ? Интересно ...
После длительного анализа постулатов 1, 2, 3 (постулаты правильные) паралельно проанализируем-ка постулат который стоял перед разроботчиками ПХП - разбить большие слова дабы они не ломали ХТМЛь оформление. Пример на верху - текстареа в которую помещаеться максимум 10 букв. Что делать ? Разбить большие слова на маленькие. Вопрос стоит - "где бить" ? Самый быстрый вариант - разбить "in fraganti" - где видим буквы вместе больше максимума, там и режим . Но чем это кривее чем разбить учитывая все константы ? Все равно слово битое получаеться, как не крути. Да и читаться лучше будет. Читатель не подсознательно привыкает к правилам оформления. Вот и привыкнек врапу после 10 букв подряд. А в твоем варианте врап будет вылезать визально "где попало". Или я опять недопонял ? Покажи альтернативу, напиши функцию врапа со всеми постулатами. |
Цитата:
PHP код:
Код:
--------------Далее: за 10 минут можно научить скрипт находить сравнительно удобные места для резки, чтобы результат меньше царапал ухо. Но обычно сие не требуется. |
*офигел, слов нет*
|
Хорошо
|
=)
|
| Часовой пояс GMT +4, время: 18:14. |
Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.