[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: вставить строчку в контент после сотого символа
veleog
Подскажите пожалуйста, как вставить строчку в контент после сотого символа?
Да и в чем дело может быть? функция substr ведет себя не очень корректно, кодировки менял.
Цитата
$a  = 'Привет Ринат. Сегодня я расскажу о таком замечательном языке программирования как PHP. ';
$b = 'Этот язык содержит множество интересных функций.';
$c = $a.$b;
$c = substr("$c", 0,10);
echo $c;


Выводит
Цитата
Приве


ВОпрос такой: как в $c вставить фразу, после сотого символа, оставляя при этом все то что находится после него. Вставить надо конкретно "<!--more-->".



Спустя 12 минут, 31 секунда (19.10.2011 - 10:10) veleog написал(а):
Почитал фак, что с кириллицей отдельный разговор

Спустя 2 минуты, 14 секунд (19.10.2011 - 10:12) bulgakov написал(а):
Смотрим описание функции substr:

string substr ( string $string , int $start [, int $length ] )

Returns the portion of string specified by the start and length parameters.

Функция возвращает часть строки начинающуюся с позиции $start длинной $length.
Можно попробовать так:

$a = "какая-то строка в которой больше 100 символов какая-то строка в которой больше 100 символов какая-то строка в которой больше 100 символов какая-то строка в которой больше 100 символов";
$start = substr($a, 0, 100);
$last = substr($a, 100);
$str = "текст который нужно вставить";
$result = $start.$str.$last;

Спустя 2 минуты, 37 секунд (19.10.2011 - 10:15) bulgakov написал(а):
Цитата
Почитал фак, что с кириллицей отдельный разговор

Зависит от кодировки (кодировки скрипта и кодировки самих строк которые нужно обрабатывать), если однобайтная типа windows-1251 то используйте функцию substr(), если кодировка многобайтная типа стандарта unicode например utf-8 - то mb_substr().

Спустя 44 минуты, 34 секунды (19.10.2011 - 10:59) Draftpad написал(а):
Хмммм, ну вообще, можно сделать ещё более грамотно:

$text = "какая-то строка в которой больше 100 символов какая-то строка в которой больше 100 символов какая-то строка в которой больше 100 символов какая-то строка в которой больше 100 символов какая-то строка в которой больше 100 символов";
$intext = " OLOLOLOLOLOLO ";

$ftext=substr_replace($text,substr($text,0,100).$intext,0,100);

echo $ftext;


Если же нужно вставлять после КАЖДОГО 100-го символа, тогда ещё проще, одной функцией wordwrap()

Спустя 1 час, 14 минут (19.10.2011 - 12:13) bulgakov написал(а):
Цитата
$ftext=substr_replace($text,substr($text,0,100).$intext,0,100);

а как substr_replace с многобайтными кодировками работает? Видимо для ее правильной работы потребуется перекодировать из юникода в однобайтную кодировку если исходная строка в юникоде.

Спустя 25 минут, 16 секунд (19.10.2011 - 12:39) Draftpad написал(а):
bulgakov, так-то в мане написано "unsafe UTF-8 function".
Лично у меня проблем с кодировками при её использовании никогда не возникало, может я просто везунчик)

Спустя 3 минуты, 46 секунд (19.10.2011 - 12:42) Winston написал(а):
Можно так еще
$text = "какая-то строка в которой больше 100 символов какая-то строка в которой больше 100 символов какая-то строка в которой больше 100 символов какая-то строка в которой больше 100 символов какая-то строка в которой больше 100 символов";
$intext = " OLOLOLOLOLOLO ";

echo preg_replace("#(.{100})#iu", '$1'.$intext, $text);

Спустя 9 дней, 8 часов, 55 минут, 43 секунды (28.10.2011 - 21:38) veleog написал(а):
Таким вариантом сделал.
$ins = '<!--more-->';

$after = 200;

$lenhIns = mb_strlen($content, 'UTF-8');

$lenStr = mb_strlen($content, 'UTF-8');

$first = mb_substr($content, 0, $after, 'UTF-8');

$firstP = mb_substr($content, $after, $lenIns, 'UTF-8');

$secP = mb_substr($content, $after, $lenStr, 'UTF-8');

$content = substr_replace($content, $first . $firstP . $ins . $secP, 0);

$content = str_replace(array("\r","\n"),"", $content);


Другой вопрос, как вставиь '<!--more-->' перед первым встречающимся тегом <p> после 200 символа?

Спустя 9 минут, 34 секунды (28.10.2011 - 21:48) veleog написал(а):
Цитата (Winston @ 19.10.2011 - 09:42)
Можно так еще
$text = "какая-то строка в которой больше 100 символов какая-то строка в которой больше 100 символов какая-то строка в которой больше 100 символов какая-то строка в которой больше 100 символов какая-то строка в которой больше 100 символов";
$intext = " OLOLOLOLOLOLO ";

echo preg_replace("#(.{100})#iu", ''.$intext, $text);

Если большой текст, то выдает следующее
какая-то строка в которой больше 100 символов-то строка в которой больше 100 символов-то строка в ко OLOLOLOLOLOLO торой больше 100 символов-то строка в которой больше 100 символов-то строка в которой больше 100 сим OLOLOLOLOLOLO волов-то строка в которой больше 100 символов-то строка в которой больше 100 символов-то строка в ко OLOLOLOLOLOLO торой больше 100 символов-то строка в которой больше 100 символов-то строка в которой больше 100 сим OLOLOLOLOLOLO волов-то строка в которой больше 100 символов-то строка в которой больше 100 символов-то строка в ко OLOLOLOLOLOLO торой больше 100 символов-то строка в которой больше 100 символов-то строка в которой больше 100 сим OLOLOLOLOLOLO волов-то строка в которой больше 100 символов-то строка в которой больше 100 символов-то строка в ко OLOLOLOLOLOLO торой больше 100 символов-то строка в которой больше 100 символов-то строка в которой больше 100 сим OLOLOLOLOLOLO волов-то строка в которой больше 100 символов-то строка в которой больше 100 символов-то строка в ко OLOLOLOLOLOLO торой больше 100 символов-то строка в которой больше 100 символов-то строка в которой больше 100 сим OLOLOLOLOLOLO волов-то строка в которой больше 100 символов-то строка в которой больше 100 символов какая-то строк OLOLOLOLOLOLO а в которой больше 100 символов какая-то строка в которой больше 100 символов какая-то строка в кото OLOLOLOLOLOLO рой больше 100 символов какая-то строка в которой больше 100 символов

Спустя 2 минуты, 27 секунд (28.10.2011 - 21:50) veleog написал(а):
Цитата (Draftpad @ 19.10.2011 - 07:59)
Хмммм, ну вообще, можно сделать ещё более грамотно:

$text = "какая-то строка в которой больше 100 символов какая-то строка в которой больше 100 символов какая-то строка в которой больше 100 символов какая-то строка в которой больше 100 символов какая-то строка в которой больше 100 символов";
$intext = " OLOLOLOLOLOLO ";

$ftext=substr_replace($text,substr($text,0,100).$intext,0,100);

echo $ftext;


Если же нужно вставлять после КАЖДОГО 100-го символа, тогда ещё проще, одной функцией wordwrap()

Здесь та же проблемка что у меня и была, именно поэтому и был вопрос.

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

Спустя 38 минут, 2 секунды (28.10.2011 - 22:28) Winston написал(а):
Цитата (veleog @ 28.10.2011 - 21:48)
Если большой текст, то выдает следующее

Дык ты бы сразу сказал, что надо только 1 замену..., тогда так напиши
echo preg_replace("#(.{100})#isu", '$1'.$intext, $text, 1);

И будет только одна замена после 100-го символа.
Цитата (veleog @ 28.10.2011 - 21:38)
Другой вопрос, как вставиь '<!--more-->' перед первым встречающимся тегом <p> после 200 символа?

Вот так
Свернутый текст
$text = "какая-то строка в которой больше 200 символов какая-то строка в которой
больше 200 символов какая-то строка в которой больше 200 символов какая-то строка в которой больше 100 символов какая-то строка в которой больше 200 символов
больше 200 символов <p> какая-то строка в </p>которой больше 200 символов какая-то строка в которой больше 100 символов какая-то строка в которой больше 200 символов
больше 200 символов какая-то строка в которой больше 200 символов какая-то <p>строка в которой больше </p>100 символов какая<p>-то </p>строка в которой больше 200 символов"
;

echo preg_replace("#(<p>)#isu", '<!--more-->$1', mb_substr($text, 200, mb_strlen($text, 'UTF-8'), 'UTF-8'), 1);

Спустя 8 минут, 37 секунд (28.10.2011 - 22:37) v.ru.n32 написал(а):
а зачем те вперся вообще вставлять строчку после 100 символа в контекст? может че другое придумаем. ты объясни зачем те это )

Спустя 26 минут, 7 секунд (28.10.2011 - 23:03) veleog написал(а):
Все сделал, всем спасибо.
Цитата
global $content;
   
$ins = '<!--more--><p>';
   
$after = 300;
   
$lenhIns = mb_strlen($content, 'UTF-8');
   
$lenStr = mb_strlen($content, 'UTF-8');

$first = mb_substr($content, 0, $after, 'UTF-8');
   
$firstP = mb_substr($content, $after, $lenIns, 'UTF-8');

$secP = mb_substr($content, $after, $lenStr, 'UTF-8');
   
    $secP = preg_replace("!<p>!si","<!--more--><p>",$secP,1);
   
$content = substr_replace($content, $first . $firstP .  $secP, 0);
   
    $content = str_replace(array("\r","\n"),"", $content);

Спустя 1 минута, 26 секунд (28.10.2011 - 23:04) veleog написал(а):
Цитата (v.ru.n32 @ 28.10.2011 - 19:37)
а зачем те вперся вообще вставлять строчку после 100 символа в контекст? может че другое придумаем. ты объясни зачем те это )

Разделитель это, что б анонсы отображать.

Спустя 23 секунды (28.10.2011 - 23:05) Winston написал(а):
Цитата (veleog @ 28.10.2011 - 23:03)
Все сделал, всем спасибо.

А мой последний пример, чем не подходит, и в одну строчку cool.gif

Спустя 4 минуты, 43 секунды (28.10.2011 - 23:09) veleog написал(а):
Цитата (Winston @ 28.10.2011 - 19:28)
Цитата (veleog @ 28.10.2011 - 21:48)
Если большой текст, то выдает следующее

Дык ты бы сразу сказал, что надо только 1 замену..., тогда так напиши
echo preg_replace("#(.{100})#isu", ''.$intext, $text, 1);

И будет только одна замена после 100-го символа.
Цитата (veleog @ 28.10.2011 - 21:38)
Другой вопрос, как вставиь '<!--more-->' перед первым встречающимся тегом <p> после 200 символа?

Вот так
Свернутый текст
$text = "какая-то строка в которой больше 200 символов какая-то строка в которой
больше 200 символов какая-то строка в которой больше 200 символов какая-то строка в которой больше 100 символов какая-то строка в которой больше 200 символов
больше 200 символов <p> какая-то строка в </p>которой больше 200 символов какая-то строка в которой больше 100 символов какая-то строка в которой больше 200 символов
больше 200 символов какая-то строка в которой больше 200 символов какая-то <p>строка в которой больше </p>100 символов какая<p>-то </p>строка в которой больше 200 символов"
;

echo preg_replace("#(<p>)#isu", '<!--more-->', mb_substr($text, 200, mb_strlen($text, 'UTF-8'), 'UTF-8'), 1);

Я его увидел только после того как разместил пост.
Текст кстати обрезается.

Спустя 3 минуты, 4 секунды (28.10.2011 - 23:12) Winston написал(а):
Можно так подправить
Свернутый текст
$text = "какая-то строка в которой больше 200 символов какая-то строка в которой
больше 200 символов какая-то строка в которой больше 200 символов какая-то строка в которой больше 100 символов какая-то строка в которой больше 200 символов
больше 200 символов <p> какая-то строка в </p>которой больше 200 символов какая-то строка в которой больше 100 символов какая-то строка в которой больше 200 символов
больше 200 символов какая-то строка в которой больше 200 символов какая-то <p>строка в которой больше </p>100 символов какая<p>-то </p>строка в которой больше 200 символов"
;
$ins = '<!--more-->';
echo preg_replace("#(<p>)#isu", mb_substr($text, 0, 200, 'UTF-8').$ins.'$1', mb_substr($text, 200, mb_strlen($text, 'UTF-8'), 'UTF-8'), 1);

Теперь не должно обрезать...

Спустя 3 минуты, 51 секунда (28.10.2011 - 23:16) veleog написал(а):
Спасибо, вообще принцип понял, доработаю сам. В последнем примере, все обрезается и соединяется не той последовательности.

Спустя 10 минут, 14 секунд (28.10.2011 - 23:27) Winston написал(а):
Цитата (veleog @ 28.10.2011 - 23:16)
В последнем примере, все обрезается и соединяется не той последовательности.

Блин.. Опять втыканул, ты в первой функции mb_substr замени mb_strlen($text, 'UTF-8') на число 200 и должно заработать smile.gif
То есть, чтобы брало от нулевого до 200 символа.

Спустя 20 минут, 7 секунд (28.10.2011 - 23:47) veleog написал(а):
Спасибо, этот вариант работает

Цитата
echo preg_replace("#(<p>)#isu", mb_substr($text, 0, 200, 'UTF-8').$ins.'$1', mb_substr($text, 0, mb_strlen($text, 'UTF-8'), 'UTF-8'), 1);


Хотя нет)) дальше ковыряю

Спустя 23 минуты, 38 секунд (29.10.2011 - 00:10) walerus написал(а):
Немного другой подход :D

function insertMore( $text, $cut = 0 )
{
$text = iconv( 'utf-8', 'windows-1251', $text );
$array = str_split( $text, $cut );

$result = array();
foreach($array as $count => $line)
{
if ( !$count )
$result[] = $line.'<!--more-->';
else
$result[] = $line;
}

$result = implode( '', $result );

return iconv( 'windows-1251', 'utf-8', $result );
}

$str = 'кая-то строка в которой больше 100 символов какая-то строка в которой больше 100 символов какая-то строка в которой больше 100 символов какая-то строка в которой больше 100 символов какая-то строка в которой больше 100 символов какая-то строка в которой больше 100 символов';

$str_more = insertMore( $str, 100 );

echo $str_more;


Результат:
кая-то строка в которой больше 100 символов какая-то строка в которой больше 100 символов какая-то с<!--more-->трока в которой больше 100 символов какая-то строка в которой больше 100 символов какая-то строка в которой больше 100 символов какая-то строка в которой больше 100 символов

Спустя 2 минуты, 53 секунды (29.10.2011 - 00:13) Winston написал(а):
Цитата (veleog @ 28.10.2011 - 23:47)
Хотя нет)) дальше ковыряю

Что не так ?

walerus
Жесть biggrin.gif
При том, ему нужно взять текст от 200-го символа, и вставить коммент перед первым параграфом (<p>)

Спустя 52 минуты, 34 секунды (29.10.2011 - 01:06) walerus написал(а):
Допилил :rolleyes:

function insertMore( $text, $cut = 0, $tag = '' )
{
$text = iconv( 'utf-8', 'windows-1251', $text );
$array = str_split( $text, $cut );

$result = array();
foreach($array as $count => $line)
{
if ( !$count )
{
if (preg_match('~'.$tag.'~iUs', $line) && $tag != '')
{
$test_tag = explode( $tag, $line);
$test_tag[0] = $test_tag[0].'<!--more-->';
$test_tag = implode( $tag, $test_tag );
$result[] = $test_tag;
}
else
$result[] = $line.'<!--more-->';
}
else
$result[] = $line;
}

$result = implode( '', $result );

return iconv( 'windows-1251', 'utf-8', $result );
}

$str = 'кая-то строка в которой больше 100 <p>символов какая-то строка</p> в которой <p>больше 100 символов</p> какая-то строка в которой больше 100 символов какая-то строка в которой больше 100 символов какая-то строка в которой больше 100 символов какая-то строка в которой больше 100 символов';
$posts = insertMore( $str, 200, '<p>' );
echo $posts;


Результ:
кая-то строка в которой больше 100 <!--more--><p>символов какая-то строка</p> в которой <p>больше 100 символов</p> какая-то строка в которой больше 100 символов какая-то строка в которой больше 100 символов какая-то строка в которой больше 100 символов какая-то строка в которой больше 100 символов


Специально вставил два тега < P >, чтоб было видно что ставит перед ПЕРВЫМ.

Спустя 16 минут, 16 секунд (29.10.2011 - 01:22) veleog написал(а):
Цитата (Winston @ 28.10.2011 - 21:13)
Цитата (veleog @ 28.10.2011 - 23:47)
Хотя нет)) дальше ковыряю

Что не так ?

walerus
Жесть biggrin.gif
При том, ему нужно взять текст от 200-го символа, и вставить коммент перед первым параграфом (<p>)

Местами все меняет.

Оставил свой вариант, вполне рабочий.

Цитата
$len = 400;
   
$lenhIns = mb_strlen($content, 'UTF-8');
   
$lenStr = mb_strlen($content, 'UTF-8');

$first = mb_substr($content, 0, $len, 'UTF-8');
   
$firstP = mb_substr($content, $len, $lenIns, 'UTF-8');

$secP = mb_substr($content, $len, $lenStr, 'UTF-8');
   
    $secP = preg_replace("!<p>!si","<!--more--><p>",$secP,1);
   
$content = substr_replace($content, $first . $firstP .  $secP, 0);

Спустя 19 минут, 18 секунд (29.10.2011 - 01:41) Winston написал(а):
Ну блин, если уже это не заработает, то я былдокодер.
Так уже должно работать 99,9%
Свернутый текст
$text = "Истоки PHP лежат в старом продукте, имев<p>шем название PHP/FI. PHP/FI был созд</p>ан Расмусом Лердорфом в 1995 году и представлял собой набор Perl-скриптов для ведения статистики посещений его резюме. Развитие web еще только начиналось, никаких специальных средств для решения этих задач не было, и к автору хлынул поток сообщений с вопросами. Лердорф начал бесплатно раздавать свой инструментарий, названный «Personal Homepages Tools» (PHP) - («Инстр<p>ументы для персональных домашних страниц»). Очень</p> скоро потребовалась большая функциональность и Ра<p>смус пишет нову</p>ю, намного более обширную версию на C, работающую с базами данных и позволяющую пользователям разрабатывать простейшие web-приложения. Расмус Лердорф решил выложить исходный код PHP/FI на всеобщее обозрение, исправление ошибок и дополнение.";
$ins = '<!--more-->';
$count = 200;
$first = mb_substr($text, 0, $count, 'UTF-8');
echo $first . preg_replace("#(<p>)#isu", $ins.'$1', mb_substr($text, $count, (mb_strlen($text, 'UTF-8')), 'UTF-8'), 1);

Спустя 18 минут, 25 секунд (29.10.2011 - 02:00) veleog написал(а):
Работает.
Быстрый ответ:

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