[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Разделители
opalaman
Всем привет,

помогите сделать так чтобы функция определяла, где стоит знак препинания или пробел и заменяла их на восклицательный знак, а буквы на минус. Т.е. если у нас есть предложение "We can watch on TV: cartoons, films, series, documentaries. But we can also use PC...", то его надо заменить на "--!---!-----!--!--!!--------!!-----!!------!!-- -----------!!---!--!---!----!---!--!!!"
Есть функция какая обрабатывает данное предложение и функция, которая определяет знаки препинания, но как их объединить...?

Вот код:

<?php

echo '<pre>';
$sentence = 'We can watch on TV: cartoons, films, series, documentaries. But we can also use PC...';
echo ("Original - $sentence\n");

function myStr($str)
{
$txt='';

for ($len=0; $len<=strlen($str)-1; $len++)
{
$txt=$txt.$str[$len];
}

return $txt;
}
echo ('New_vers - ');
echo myStr($sentence);

function myDelimiter($chCode)
{
switch($chCode)
{
case ' ':
case '.':
case ',':
case ':':
return true;
echo '!';
}
return false;
echo '-';
}


Заранее спасибо.



Спустя 7 минут, 25 секунд (2.08.2011 - 22:01) neadekvat написал(а):
$str = 'We can watch on TV: cartoons, films, series, documentaries. But we can also use PC...';
$str = preg_replace('#[[:punct:]]#', '!', $str);
$str = str_replace(' ', '!', $str);
$str = preg_replace('#\w#', '-', $str);
echo $str;

Спустя 7 минут, 2 секунды (2.08.2011 - 22:08) opalaman написал(а):
neadekvat
а с использованием этих 2 функций никак нельзя этого сделать?

Спустя 37 секунд (2.08.2011 - 22:09) neadekvat написал(а):
А нахрена? (с)

Спустя 4 минуты, 43 секунды (2.08.2011 - 22:14) opalaman написал(а):
neadekvat
чтобы научиться... интересует именно соотношение этих двух функций...

п.с. за помощь спасибо.

Спустя 14 минут, 38 секунд (2.08.2011 - 22:28) neadekvat написал(а):
Цитата (opalaman @ 2.08.2011 - 23:14)
чтобы научиться... интересует именно соотношение этих двух функций...

Хочешь на своих функциях? Ну ладно.

Во-первых, функция myStr просто возвращает ту же строку. Выкидываем.
Во-вторых, функция myDelimiter возвращет булевое значение, непонятно, зачем она вообще нужна. Выкидываем.

echo '<pre>';
$sentence = 'We can watch on TV: cartoons, films, series, documentaries. But we can also use PC...';
echo "Original - $sentence\n";

function delete_punct($str)
{
$puncts = '-!"#$%&\'()*+,./:;<=>?@[\\\]_`{|}~ ';
$puncts_array = str_split($puncts);

$str = str_replace($puncts_array, '!', $str);

return $str;
}

function delete_words($str)
{
$words = 'abcdefghijklmnopqrstuvwxyz0123456789';
$words_array = str_split($words);

$str = strtolower($str);
$str = str_replace($words_array, '-', $str);

return $str;
}

$sentence = delete_punct($sentence);
$sentence = delete_words($sentence);

echo "New vers - $sentence\n";

Вот, изучай. Ничего сложного - одни стандартные функции. Заодно с документацией познакомишься.

Кода в стопиццот раз больше, а делает он меньше, чем мой первый вариант в три строчки, т.к. здесь тебе вручную надо перечислять ряд букв, а там, в первом варианте, они все, со всех языков.

Спустя 4 минуты, 12 секунд (2.08.2011 - 22:33) alex12060 написал(а):
neadekvat

красава (с)

Спустя 49 секунд (2.08.2011 - 22:33) opalaman написал(а):
neadekvat
Еще раз спасибо.

Спустя 5 минут, 26 секунд (2.08.2011 - 22:39) opalaman написал(а):
neadekvat
Просто это как бы изначальное задание... в итоге надо сделать так, чтобы текст переворачивался задом наперед, а знаки препинания оставались на месте. Т.е. из исходного текста надо получить "eW nac hctaw no VT: snootrac, smlif, seires, seiratnemucod. tuB ew nac osla esu CP..."

Спустя 3 минуты, 47 секунд (2.08.2011 - 22:43) alex12060 написал(а):
opalaman

А тоже не сложно smile.gif

Спустя 2 минуты, 3 секунды (2.08.2011 - 22:45) neadekvat написал(а):
Так это немножко иное задание, да?)
Во-первых, для этого есть готовая функция (strrev).
Во-вторых, опять-таки, если свой велоспед:
echo '<pre>';
$sentence = 'We can watch on TV: cartoons, films, series, documentaries. But we can also use PC...';
echo "Original - $sentence\n";

function str_reverse($str)
{
$len = strlen($str) - 1;

$new_str = null;
for ($i = $len; $i >= 0; $i--)
$new_str .= $str[$i];

return $new_str;
}

$sentence = str_reverse($sentence);

echo "New vers - $sentence\n";

Спустя 5 минут, 40 секунд (2.08.2011 - 22:50) opalaman написал(а):
neadekvat

это просто разворачивает всё задом наперёд =) Для разворота текста задом наперед только по буквам у словах у меня есть такая функция:
function newReverse($new_text)
{
function myReverse($str)
{
$text='';

for ($length=strlen($str)-1; $length>=0; $length--)
{
$text=$text.$str[$length];
}

return $text;
}
return implode(' ', array_map('myReverse', explode(' ', "$new_text")));
}


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

Спустя 1 минута, 9 секунд (2.08.2011 - 22:52) neadekvat написал(а):
Ничего не понимаю.

Функция, чтобы расставить знаки - есть.
Функция, чтобы развернуть строку - есть (да, я понял, что надо развернуть только слова в строке, но сути непонимания это не меняет)
Что еще нужно то?

Спустя 2 минуты, 24 секунды (2.08.2011 - 22:54) opalaman написал(а):
neadekvat
ну... я просто описал что и как =)
сейчас попробую объединить а и б wink.gif

Спустя 1 минута, 6 секунд (2.08.2011 - 22:55) neadekvat написал(а):
Цитата (opalaman @ 2.08.2011 - 23:54)

сейчас попробую объединить а и б

Да брось, что тут объединять? Сначала обрабатываешь строки функцией развоорота, потом функцией замены на знаки.

Спустя 5 минут, 40 секунд (2.08.2011 - 23:01) opalaman написал(а):
neadekvat
Цитата
...потом функцией замены на знаки.


на какие знаки?
надо чтобы знаки препинания находились на своих местах (как в исходном тексте). Т.е. с исходника "We can watch on TV: cartoons, films, series, documentaries. But we can also use PC..." надо получить не "eW nac hctaw no :VT ,snootrac ,smlif ,seires .seiratnemucod tuB ew nac osla esu ...CP" (что довольно таки просто), а "eW nac hctaw no VT: snootrac, smlif, seires, seiratnemucod. tuB ew nac osla esu CP...".

Спустя 11 минут, 48 секунд (2.08.2011 - 23:12) neadekvat написал(а):
Я понял это. Но у тебя же есть для этого функция, ты сказал, и даже показал ее.

В смысле на какие? оО На ! и -. Или и это уже не надо, оказывается?

Спустя 9 минут, 13 секунд (2.08.2011 - 23:22) opalaman написал(а):
neadekvat
Цитата
Но у тебя же есть для этого функция, ты сказал, и даже показал ее.
Да, но эта функция понимает "cartoons," как одно слово и поворачивает его как ",snootrac", а надо как-то выделить знаки препинания и отделить их от обычных слов. Т.е. получалось "snootrac,". Для этого и создал функцию myDelimiter чтобы опредилить знаки препинания. А как её объединить с функцией newReverse чтобы выводило всё коректно еще не допёр.

function newReverse($new_text)
{
function myReverse($str)
{
$text='';

for ($length=strlen($str)-1; $length>=0; $length--)
{
$text=$text.$str[$length];
}

return $text;
}
return implode(' ', array_map('myReverse', explode(' ', "$new_text")));
}
function myDelimiter($chCode)
{
switch($chCode)
{
case ' ':
case '.':
case ',':
case ':':
return true;
}
return false;
}


п.с. да, замена на ! и - пока ненадо.
п.с.с. наконецто смогу тебе + поставить :)

Спустя 8 минут, 20 секунд (2.08.2011 - 23:30) neadekvat написал(а):
Так и сказал бы сразу так, что разворачивает слова неправильно)

Как тебе такой вариант:
function is_punct($sym)
{
$puncts = '-!"#$%&\'()*+,./:;<=>?@[\\\]_`{|}~ ';
$puncts_array = str_split($puncts);

if (in_array($sym, $puncts_array))
return true;

return false;
}

function myReverse($str)
{
$text = '';
$pucnts = '';

for ($length=strlen($str)-1; $length>=0; $length--)
{
if ( ! is_punct($str[$length]))
$text .= $str[$length];
else
$pucnts .= $str[$length];
}

return $text . $pucnts;
}

function newReverse($new_text)
{
return implode(' ', array_map('myReverse', explode(' ', $new_text)));
}

$sentence = newReverse($sentence);
echo $sentence;

Спустя 3 минуты, 21 секунда (2.08.2011 - 23:33) opalaman написал(а):
neadekvat
всё работает как по маслу!
Огромное спасибо.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.