помогите сделать так чтобы функция определяла, где стоит знак препинания или пробел и заменяла их на восклицательный знак, а буквы на минус. Т.е. если у нас есть предложение "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 функций никак нельзя этого сделать?
а с использованием этих 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..."
Просто это как бы изначальное задание... в итоге надо сделать так, чтобы текст переворачивался задом наперед, а знаки препинания оставались на месте. Т.е. из исходного текста надо получить "eW nac hctaw no VT: snootrac, smlif, seires, seiratnemucod. tuB ew nac osla esu CP..."
Спустя 3 минуты, 47 секунд (2.08.2011 - 22:43) alex12060 написал(а):
opalaman
А тоже не сложно
А тоже не сложно
Спустя 2 минуты, 3 секунды (2.08.2011 - 22:45) neadekvat написал(а):
Так это немножко иное задание, да?)
Во-первых, для этого есть готовая функция (strrev).
Во-вторых, опять-таки, если свой велоспед:
Во-первых, для этого есть готовая функция (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
ну... я просто описал что и как =)
сейчас попробую объединить а и б
ну... я просто описал что и как =)
сейчас попробую объединить а и б
Спустя 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
всё работает как по маслу!
Огромное спасибо.
всё работает как по маслу!
Огромное спасибо.