Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум Регулярные Выражения

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: php заменить не первое вхождение
 
 автор: tuder   (07.07.2011 в 19:59)   письмо автору
 
 

Если поискать в яндексе тему, то предлагается исключительно два варианта. Либо str_replace и замена всех подстрок. Либо пример с preg_replace для замены первой подстроки... :-\

У меня же встала задача заменить одну, но не первую, а заданную подстроку - третью, пятую или иную по счёту в тексте. Вот какой костыль в итоге у меня получился для замены пробела. Точнее вставки после пробела номер $num какого-то текста.

$content=str_replace("#", "@@@", $content);   // убираю из текста решётки, если таковые там есть
$content=preg_replace("/[ ]/", "#", $content, $num); // заменяю нужное количество вхождений на решётку
$content=preg_replace("/[#]/", " ", $content, $num-1); // заменяю обратно решётки на нужное вхождение, но уже на одно меньше
$content=str_replace("#", " <!--this-->", $content); // оставшуюся решётку меняю на нужный текст
$content=str_replace("@@@", "#", $content); // возвращаю решётки на место


Может можно придумать более изящное решение? Ибо далее идут более сложные варианты этой же проблемы.

Так вместо пробела нужно вставить текст после точки. В простом тексте замена пробела на точку в вышеуказанном коде работает. Но точка имеется ведь и в восклицательном и вопросительном знаке (надо бы ещё исключить двоеточие и считать многоточие за точку) и это надо учесть. Тогда такое вроде срабатывает:

$content=preg_replace("/[.|!|?]/", "#", $content, $num);


Но! :-( Тогда при обратной замене все восклицательные/вопросительные знаки меняются на точки...
А это уже не устраивает.

Третий степень сложности - это когда в тексте попадаются тэги, тогда при первом варианте с пробелом - подсчитываются пробелы и внутри тэгов, а это уже точно не нужно. Тэги бы надо изъять, а потом вернуть на место. :-) Также как и вернуть на место восклицательные/вопросительные знаки.

Можно ли что-то придумать для такой нетривиальной задачи? Или писать большую функцию, где крыжить текст на куски в массивы и потом склеивать обратно? Или может разрезать с учётом вышеописанного с помощью preg_match?

  Ответить  
 
 автор: Deed   (07.07.2011 в 22:13)   письмо автору
 
   для: tuder   (07.07.2011 в 19:59)
 

Я ничего не понял. Лучше напишите примеры исходного текста и того, что желаете видеть в итоге.

  Ответить  
 
 автор: tuder   (09.07.2011 в 18:33)   письмо автору
 
   для: Deed   (07.07.2011 в 22:13)
 

Пример 1.

- Ну уж нет, не дождетесь! Не для того я на вершину пищевой цепочки забрался, чтобы салат зеленый жрать!</p>
<p>***</p>
<p>В детском саду сидят две 5-ти летние девочки. Одна другой хвастает:<br />
- А у нас появился новый папа!<br />
- И как его зовут?<br />
- Иван Михайлович.<br />
- Иванов?<br />
- Ага.<br />
- Этот хороший! В прошлом году и он был у нас папой.</p>
<p>***</p>


После определённого количества "точек" (под точками подразумеваем знаки ".!?", желательно за один знак принимать и многоточие "...") вставить, предположим тэг "<!--this-->"
Скажем, после пятой "точки". Чтобы получилось

- Ну уж нет, не дождетесь! Не для того я на вершину пищевой цепочки забрался, чтобы салат зеленый жрать!</p>
<p>***</p>
<p>В детском саду сидят две 5-ти летние девочки. Одна другой хвастает:<br />
- А у нас появился новый папа!<br />
- И как его зовут?<br />
- Иван Михайлович.<br />
- Иванов?<!--this--><br />
- Ага.<br />
- Этот хороший! В прошлом году и он был у нас папой.</p>
<p>***</p>


Пример 2.

<img align='left' vspace=10 hspace=10  src='/SiteImages/prod/aot-vibroshape.jpg'>Виброшэйп пояс вибро-массажный для снижения веса с функцией подогрева поможет вам привести фигуру в порядок
 и избавиться от целлюлита.<br />Массажный пояс расщепляет жиры, воздействуя на них с помощью вибрации. Расщепленные
 жиры впоследствии выводятся из организма через лимфасистему. Используя
 пояс для похудания, ваш организм сможет получать общее оздоровление. 


Задаём вставить после 20го пробела. Должно получиться так

<img align='left' vspace=10 hspace=10  src='http://www.goodbody.ru/SiteImages/prod/aot-vibroshape.jpg'>Виброшэйп пояс вибро-массажный для снижения веса с функцией подогрева поможет вам привести фигуру в порядок
 и избавиться от целлюлита.<br />Массажный пояс <!--this-->расщепляет жиры, воздействуя на них с помощью вибрации. Расщепленные
 жиры впоследствии выводятся из организма через лимфасистему. Используя
 пояс для похудания, ваш организм сможет получать общее оздоровление. 


то есть не должны подсчитываться пробела в тэгах. Только в тексте.

  Ответить  
 
 автор: Deed   (09.07.2011 в 20:01)   письмо автору
 
   для: tuder   (09.07.2011 в 18:33)
 


<?php
$mumu
=<<< DEED

- Ну уж нет, не дождетесь! Не для того я на вершину пищевой цепочки забрался, чтобы салат зеленый жрать!</p>
<p>***</p>
<p>В детском саду сидят две 5-ти летние девочки. Одна другой хвастает:<br />
- А у нас появился новый папа!<br />
- И как его зовут?<br />
- Иван Михайлович.<br />
- Иванов?<br />
- Ага.<br />
- Этот хороший! В прошлом году и он был у нас папой.</p>
<p>***</p>
<p>
Сегодня читал в туалете Донцову. И, знаете, срать было интересней...</p>
<br />
DEED;
$check=preg_match_all("/.+?(\.|\?|!){1,}/s",$mumu,$check_out);
if(
$check>=5){
    
preg_match_all("/.+?(\.|\?|!){1,}/s",$mumu,$check_out);
     
$desc="";
    for(
$i=0;$i<6;$i++){
        
$desc.=$check_out[0][$i];
        
    }
    
$desc=$desc."<!--this-->";
    for(
$i=6;$i<$check;$i++){
        
$desc.=$check_out[0][$i];
    }
}
echo 
$desc;

/* На выходе:

- Ну уж нет, не дождетесь! Не для того я на вершину пищевой цепочки забрался, чтобы салат зеленый жрать!</p>
<p>***</p>
<p>В детском саду сидят две 5-ти летние девочки. Одна другой хвастает:<br />
- А у нас появился новый папа!<br />
- И как его зовут?<br />
- Иван Михайлович.<!--this--><br />
- Иванов?<br />
- Ага.<br />
- Этот хороший! В прошлом году и он был у нас папой.</p>
<p>***</p>
<p>
Сегодня читал в туалете Донцову. И, знаете, срать было интересней...
*/
?>


Аналогично с пробелами:

<?php
$mumu2
=<<< DEED
<img align='left' vspace=10 hspace=10  src='/SiteImages/prod/aot-vibroshape.jpg'>Виброшэйп пояс вибро-массажный для снижения веса с функцией подогрева поможет вам привести фигуру в порядок
 и избавиться от целлюлита.<br />Массажный пояс расщепляет жиры, воздействуя на них с помощью вибрации. Расщепленные
 жиры впоследствии выводятся из организма через лимфосистему. Используя
 пояс для похудания, ваш организм сможет получать общее оздоровление.
Следует, также, заметить, что вышесказанное не относится к зажравшемуся президенту Украины Януковичу, лимфосистема которого, как и совесть, полностью атрофирована.... 
DEED;

$check2=preg_match_all("/.+?\s/s",$mumu2,$check_out2);
if (
$check2>20){
    
$desc2="";
    
preg_match_all("/.+?\s/s",$mumu2,$check_out2);
    for(
$i=0;$i<20;$i++){
        
        
$desc2.=$check_out2[0][$i];
    }
    
$desc2=$desc2."<!--this-->";
    for(
$i=20;$i<$check2;$i++){
        
$desc2.=$check_out2[0][$i];
    }
    
}
echo 
$desc2;
?>



Хотя, здесь целесообразнее применить что-то вроде

<?
$temp_str
=explode(" ",$mumu2,20);
?>

  Ответить  
 
 автор: tuder   (11.07.2011 в 05:50)   письмо автору
 
   для: Deed   (09.07.2011 в 20:01)
 

>> Третий степень сложности - это когда в тексте попадаются тэги, тогда при первом варианте с
>> пробелом - подсчитываются пробелы и внутри тэгов, а это уже точно не нужно.

>Аналогично с пробелами:
Почему-то у меня в этом примере вставляется после 17го пробела. 8-) При этом учитываются и пробелы внутри тэгов. А нужно только в тексте.

>
>Хотя, здесь целесообразнее применить что-то вроде
>

><?
>$temp_str=explode(" ",$mumu2,20);
>
?>
>


Вот как раз из-за того, чтобы исключить подсчёт и учёт пробелов или точек в тэгах и возникла проблема и необходимость регулярных выражениях.

Первый пример, да, работает. Даже если маленько видоизменить текст:

<img align='left' src='/SiteImages/prod/aot-vibroshape.jpg'>
<p>
Сегодня читал в туалете Донцову. И, знаете, срать было интересней...</p>
<p>***</p>
<p>- Ну уж нет, не дождетесь! Не для того я на вершину пищевой<br />
цепочки забрался, чтобы салат зеленый жрать!</p>
<p>В детском саду сидят две 5-ти летние девочки. Одна другой хвастает:<br />
- А у нас появился новый папа!<br />
- И как его зовут?<br />
- Иван Михайлович.<br />
- Иванов?<br />
- Ага.<br />
- Этот хороший! В прошлом году и он был у нас папой.</p>
<p>***</p>


То на выходе получаю:
<img align='left' src='/SiteImages/prod/aot-vibroshape.jpg'>
<p>
Сегодня читал в туалете Донцову. И, знаете, срать было интересней...</p>
<p>***</p>
<p>- Ну уж нет, не дождетесь! Не для того я на вершину пищевой<br />
цепочки забрался, чтобы салат зеленый жрать!</p>
<p>В детском саду сидят две 5-ти летние девочки.<!--this--> Одна другой хвастает:<br />
- А у нас появился новый папа!<br />
- И как его зовут?<br />
- Иван Михайлович.<br />
- Иванов?<br />
- Ага.<br />
- Этот хороший! В прошлом году и он был у нас папой.


<!--this--> вставляется, как и хотелось. С учётом "?!" и многоточия, которое засчитывается за одну точку. Но при этом опять же учитывается точка в нутри тэга <img>.
И почему-то "съедается" последний тэг "<p>***</p>", если же после него поставить что-либо, например "<p>***</p>!" - то так всё и выводится...

Можно ли ввести шаблон, который бы исключал поиск пробелов/точек внутри <>, где бы они в тексте не находились?

  Ответить  
 
 автор: Deed   (11.07.2011 в 07:38)   письмо автору
 
   для: tuder   (11.07.2011 в 05:50)
 

Ну, пробелы можно детектировать примерно так:
\s(?![^<]*?(p|'|"|v|\d|n|--|a|\s)>)
где (p|'|"|v|\d|n|--|a|\s)> - навскидку экран для </p>, ...">, </div>, </Hn>, </span> и так далее (можно продолжить).
Единственный недостаток этой регулярки в том, что Ваш <!---This--> может вставиться в пробел между двух слов текстовой ссылки:
<a title="Произвольное описание" href="http://movie.test.ru/02/64">рыбий<!---This-->жир</a>

НО перед этим нужно будет заменить в исходной строке все <br /> на <br> при помощи str_replace

  Ответить  
 
 автор: tuder   (12.07.2011 в 14:45)   письмо автору
 
   для: Deed   (11.07.2011 в 07:38)
 

Ок. Спасибо. Скомбинировал explode и регулярное выражение. Убрал из поиска тэги.
В итоге получил универсальную функцию.


<?php

$mumu
="<img align='left' src='plus.gif'>
<p>Сегодня читал в туалете Донцову. И, знаете, срать было интересней...</p>
<p>***</p>
<p>- Ну уж нет, не дождетесь! Не для того я на вершину пищевой<br />
цепочки забрался, чтобы салат зеленый жрать!</p>
<p>В детском саду сидят две 5-ти летние девочки. Одна другой хвастает:<br />
- А у нас появился новый папа!<br />
- И как его зовут?<br />
- Иван Михайлович.<br />
- Иванов?<br />
- Ага.<br />
- Этот хороший! В прошлом году и он был у нас папой.</p>
<img align='left' src='plus.gif'>
<p>***</p>
"
;
echo 
"После 20го пробела<br />";
echo 
insertafterany($mumu20"@@@<!--this-->"FALSE);

echo 
"После 10й точки<br />";
echo 
insertafterany($mumu10"@@@<!--this-->"TRUE);

function 
insertafterany($text$count$insert$point) {

   
$num=0;
   
$desc="";
   
$cont=explode(">"$text);

   for (
$i=0$i<sizeof($cont)-1$i++) {
       
$l=explode("<"$cont[$i]);

       if (
$point) {
          
preg_match_all("/.+?(\.|\?|!){1,}/s"$l[0], $check);
          
$check_out=$check[0];
       } else {
          
$check_out=explode(" "$l[0]);
//        preg_match_all("/.+?\s/s", $l[0], $check);
//        $check_out=$check[0];
       
}

       for (
$j=0$j<sizeof($check_out); $j++) {

           if (
substr_count($l[0], " ")>0) {
               
$num++;
           }

           
$desc.=$check_out[$j];

           if (
$j<sizeof($check_out)-and !$point) {
              
$desc.=" ";
           }
           if (
$num==$count) {
              
$desc.=$insert;
           }
       }

       
$desc.="<".$l[1].">";
   }
   return 
$desc;
// insertafteranyspace

?>


Вроде всё работает как хотелось.
Только почему-то preg_match_all съедает звёздочки при поиске точек и часть переводов строк.
Вот здесь можно посмотреть результат работы и в исходниках увидеть, что при использовании preg_match_all изменяется структура разбивки текста, в отличии от разбивки explode по пробелам.

А по пробелам поиск с помощью preg_match_all вообще не получается. Что-то лишнее засчитывается.

  Ответить  
 
 автор: .....   (13.07.2011 в 00:10)
 
   для: tuder   (12.07.2011 в 14:45)
 

примерно такое можно попробовать ,если правильно понял...
<?php
header
('content-type: text/plain');

$count=5;
$re='%\G(?:(?:<a\s.+?</a>)+|(?:<[^>]*>)+|[^.?!<]+)*[.?!]\.*%xis';

function 
xxx($m) {
 static 
$it=1;
 global 
$count;
 
 if (
$it==$count) {
    
$it=1;
    return 
$m[0] .'__this__';
 }
 
$it++;
 return 
$m[0];
}

echo 
$txt preg_replace_callback($re'xxx'$txt$count);

но кроме <a>......</a> бывают всякие <script>,<style>, <!--.... --> ........

  Ответить  
 
 автор: .....   (13.07.2011 в 00:27)
 
   для: .....   (13.07.2011 в 00:10)
 

и не учитывается напрример такой возможный текст "<<<....>>>" или "<...<...>"
обработка просто прекратится и счётчик не сбросится, как и в случае недостаточного колличества совпадений

  Ответить  
 
 автор: Deed   (13.07.2011 в 11:21)   письмо автору
119.4 Кб
 
   для: .....   (13.07.2011 в 00:27)
 

Регулярка, конечно, мощная и интересная, но (см. приаттаченную картинку)

  Ответить  
 
 автор: tuder   (13.07.2011 в 12:00)   письмо автору
 
   для: Deed   (13.07.2011 в 11:21)
 

Так в этой регулярке .|!|?, а не пробелы.

  Ответить  
 
 автор: Deed   (13.07.2011 в 12:52)   письмо автору
64.2 Кб
 
   для: tuder   (13.07.2011 в 12:00)
 

Ну, и зачем все так усложнять-то??
/(?!=<)[^<>'\*]+(?=<)/

  Ответить  
 
 автор: tuder   (13.07.2011 в 14:31)   письмо автору
 
   для: Deed   (13.07.2011 в 12:52)
 

Усложнять точно не стоит. :-)
Я там только и понял, где точки на пробел заменить.
Но в данном контексте

$re='%\G(?:(?:<a\s.+?</a>)+|(?:<[^>]*>)+|[^.?!<]+)*[.?!]\.*%xis';


Куда подставить
/(?!=<)[^<>'\*]+(?=<)/
?
Это же только исключение тэгов, насколько я понял?

  Ответить  
 
 автор: Deed   (13.07.2011 в 11:22)   письмо автору
60.1 Кб
 
   для: .....   (13.07.2011 в 00:27)
 

В то время, как (см. приаттаченный скрин):

  Ответить  
 
 автор: tuder   (13.07.2011 в 12:36)   письмо автору
 
   для: Deed   (13.07.2011 в 11:22)
 

Поизучал справочник. Понял, почему не получалось для пробелов. Вставлялось раньше, чем нужно.
Здесь ищутся пробельные символы \s = [\t\ \r\f\n].
Поэтому подсчитывались ещё и переводы строки. И вообще, вроде. как и конец каждого тэга.

Поэтому просто заменил в [.|!|?] на [\ ] и всё получилось:


<?php

$mumu
="
<img align='left' src='plus.gif'>
<p>Сегодня читал в туалете Донцову. И, знаете, срать было интересней...</p>
<p>***</p>
<p>- Ну уж нет, не дождетесь! Не для того я на вершину пищевой<br />
цепочки забрался, чтобы салат зеленый жрать!</p>
<p>В детском саду сидят две 5-ти летние девочки. Одна другой хвастает:<br />
- А у нас появился новый папа!<br />
- И как его зовут?<br />
- Иван Михайлович.<br />
- Иванов?<br />
- Ага.<br />
- Этот хороший! В прошлом году и он был у нас папой.</p>
<img align='left' src='plus.gif'>
<p>***</p>
"
;

echo 
"После 10й точки<br />";
$count=10;
$re='%\G(?:(?:<a\s.+?</a>)+|(?:<[^>]*>)+|[^.|!|?<]+)*[.?!]\.*%xis';
echo 
$txt preg_replace_callback($re'insertthis'$mumu$count);

echo 
"После 20го пробела<br />";
$count=20;
$re='%\G(?:(?:<a\s.+?</a>)+|(?:<[^>]*>)+|[^\ <]+)*[\ ]\.*%xis';
echo 
$txt preg_replace_callback($re'insertthis'$mumu$count);

function 
insertthis($cont) {
 static 
$it=1;
 global 
$count;

 if (
$it==$count) {
    
$it=1;
    return 
$cont[0] .'@@@<!--this-->';
 }
 
$it++;
 return 
$cont[0];
}

?>


И если посмотреть исходник, то ничего не теряется.

  Ответить  
 
 автор: .....   (13.07.2011 в 22:59)
 
   для: Deed   (13.07.2011 в 11:22)
 

\s(?!......) тоже в определённых случаях находит что совпадение началось не во внутренностях тега, проверка быстро стартует, но неизвестно сколько байт строки будет проверяться после каждого найденного пробела.

а я просто размыслил что лексически-анализируя текст выражением типа \G(<[^>]*>|[^\.]+|\.) в php пока нет возможности указать лимит колличества проверок взависимости от числа нахождений только одной из трёх альтернатив
, зато найденное может включать сразу всё, чтобы по порядку пройти весь проверяемый текст
, костыль типа \G(<[^>]*>|[^\.]+)*\.
Но немного топорно всё это показал , практически сразу первый черновой вариант
, хотя-бы убрать оттуда "(?:<a\s.+?</a>)+|" немного сокращает,
времени за компом провожу в последнее время по минут 20 в неделю, да и одно только обязательное return в callback-функции отбивает всё желание делать это на php
...... Ну нет в php таких циклов , например как while($x=~/..../gc){} в перл. Вернее custom-реализация такого цикла, оч некрасиво выглядит, приходится довольствоваться этой preg_replace_callback()


// ....... С пробелами сложнее, если это html, то в браузере не всегда видно все из пробелов, или наоборот видно там где их нет, и не понятно какие из каких пробелов нужны .
//// Извиняюсь, но нет времени что-то оптимизировать или развёрнуто показать. Бывает время в опере-mini , но там текст со скриншотов совсем не читаемый :)

  Ответить  
 
 автор: Deed   (13.07.2011 в 23:17)   письмо автору
 
   для: .....   (13.07.2011 в 22:59)
 

Спасибо! Нужно будет попристальнее изучить "костыли" регэкспов.
Удачи Вам!

  Ответить  
 
 автор: tuder   (13.07.2011 в 11:47)   письмо автору
 
   для: .....   (13.07.2011 в 00:10)
 

Спасибо. Работает. Интересно и коротко.
Почему-то у меня в питерском справочнике PHP4 Григина нет такой функции.

А тэги ссылок не нужно учитывать. Во-первых, в моём случае, текст предварительно обрабаывается с помощью strip_tags($content, "<img><p>"). Так что остаются только тэги форматирования текста. Но лучше убрать из подсчёта вообще всё то, что находится между угловыми скобками.

  Ответить  
 
 автор: Deed   (13.07.2011 в 15:52)   письмо автору
 
   для: tuder   (13.07.2011 в 11:47)
 

20-й пробел


<?php

$mumu
=<<< DEED
<img align='left' src='plus.gif'>
<p>Сегодня читал в туалете Донцову. И, знаете, срать было интересней...</p>
<p>***</p>
<p>- Ну уж нет, не дождетесь! Не для того я на вершину пищевой<br />
цепочки забрался, чтобы салат зеленый жрать!</p>
<p>В детском саду сидят две 5-ти летние девочки. Одна другой хвастает:<br />
- А у нас появился новый папа!<br />
- И как его зовут?<br />
- Иван Михайлович.<br />
- Иванов?<br />
- Ага.<br />
- Этот хороший! В прошлом году и он был у нас папой.</p>
<img align='left' src='plus.gif'>
<p>***</p> 
DEED;

$check=preg_match_all("/(<[^>]+>|[^<>])+?\s/",$mumu,$check_out);
 
$desc="";
for(
$i=0;$i<20;$i++){
   
    
$desc.=$check_out[0][$i];
}
$desc=$desc."<!--This!-->";

for(
$i=20;$i<$check;$i++){
    
    
$desc.=$check_out[0][$i];
}
echo 
$desc;

/*
<img align='left' src='plus.gif'>
<p>Сегодня читал в туалете Донцову. И, знаете, срать было интересней...</p>
<p>***</p>
<p>- Ну уж нет, не дождетесь! Не для <!--This!-->того я на вершину пищевой<br />
цепочки забрался, чтобы салат зеленый жрать!</p>
<p>В детском саду сидят две 5-ти летние девочки. Одна другой хвастает:<br />
- А у нас появился новый папа!<br />
- И как его зовут?<br />
- Иван Михайлович.<br />
- Иванов?<br />
- Ага.<br />
- Этот хороший! В прошлом году и он был у нас папой.</p>
<img align='left' src='plus.gif'>
<p>***</p> 
*/
?>

ВСЕ работает. Для полноты посмотрите:

<?php
echo "<pre>";
print_r($check_out[0]);
echo 
"</pre>";
?>


То есть, пробелы в тегах не затронуты.

  Ответить  
 
 автор: tuder   (13.07.2011 в 19:36)   письмо автору
 
   для: Deed   (13.07.2011 в 15:52)
 


<img align='left' src='plus.gif'> 
<p>Сегодня1читал2в3туалете4Донцову.5И,6знаете,7срать8было9интересней...</p> 
<p>***</p> 
<p>-10Ну11уж12нет,13не14дождетесь!15Не16для17<!--This!-->того18я19на20вершину


Может я что-то недопонимаю? Я пронумеровал пробелы. Или то, что я понимаю под пробелами. :-)

Здесь тхис стоит после 17го. В примерах, приводимых мною по ссылкам, вставляется после предлога "на ", я там @@@ вывожу вместе с невидимым визуально тхис.

  Ответить  
 
 автор: Deed   (13.07.2011 в 20:37)   письмо автору
 
   для: tuder   (13.07.2011 в 19:36)
 

И не "тхис", а Зис.
Нужно сообщить о таком феномене Cheops'y! Что-то не так с заполнением $desc...

Вот этот вариант работает безупречно, хотя, почему - вопрос:

<?php
$mumu
=<<< DEED
<img align='left' src='plus.gif'>
<p>Сегодня читал в туалете Донцову. И, знаете, срать было интересней...</p>
<p>***</p>
<p>- Ну уж нет, не дождетесь! Не для того я на вершину пищевой<br />
цепочки забрался, чтобы салат зеленый жрать!</p>
<p>В детском саду сидят две 5-ти летние девочки. Одна другой хвастает:<br />
- А у нас появился новый папа!<br />
- И как его зовут?<br />
- Иван Михайлович.<br />
- Иванов?<br />
- Ага.<br />
- Этот хороший! В прошлом году и он был у нас папой.</p>
<img align='left' src='plus.gif'>
<p>***</p> 
DEED;

$check=preg_match_all("/(<[^>]+>|[^<>])+? /",$mumu,$check_out);
 
$desc1="";
for(
$i=0;$i<20;$i++){
   
    
$desc1.=$check_out[0][$i];
}
$desc=$desc1."<!--This!-->";

for(
$i=20;$i<$check;$i++){
    
    
$desc.=$check_out[0][$i];
}
echo 
$desc;

echo 
"<br /><br />";

echo 
"<pre>";
print_r($check_out[0]);
echo 
"</pre>";

/*
<img align='left' src='plus.gif'>
<p>Сегодня читал в туалете Донцову. И, знаете, срать было интересней...</p>
<p>***</p>
<p>- Ну уж нет, не дождетесь! Не для того я на <!--This!-->вершину пищевой<br />
цепочки забрался, чтобы салат зеленый жрать!</p>
<p>В детском саду сидят две 5-ти летние девочки. Одна другой хвастает:<br />
- А у нас появился новый папа!<br />
- И как его зовут?<br />
- Иван Михайлович.<br />
- Иванов?<br />
- Ага.<br />
- Этот хороший! В прошлом году и он был у нас папой.</p>
<img align='left' src='plus.gif'>
<p>***</p> <br /><br /><pre>Array
(
    [0] => <img align='left' src='plus.gif'>
<p>Сегодня 
    [1] => читал 
    [2] => в 
    [3] => туалете 
    [4] => Донцову. 
    [5] => И, 
    [6] => знаете, 
    [7] => срать 
    [8] => было 
    [9] => интересней...</p>
<p>***</p>
<p>- 
    [10] => Ну 
    [11] => уж 
    [12] => нет, 
    [13] => не 
    [14] => дождетесь! 
    [15] => Не 
    [16] => для 
    [17] => того 
    [18] => я 
    [19] => на 
    [20] => вершину 
    [21] => пищевой<br />
цепочки 
    [22] => забрался, 
    [23] => чтобы 
    [24] => салат 
    [25] => зеленый 
    [26] => жрать!</p>
<p>В 
    [27] => детском 
    [28] => саду 
    [29] => сидят 
    [30] => две 
    [31] => 5-ти 
    [32] => летние 
    [33] => девочки. 
    [34] => Одна 
    [35] => другой 
    [36] => хвастает:<br />

    [37] => А 
    [38] => у 
    [39] => нас 
    [40] => появился 
    [41] => новый 
    [42] => папа!<br />

    [43] => И 
    [44] => как 
    [45] => его 
    [46] => зовут?<br />

    [47] => Иван 
    [48] => Михайлович.<br />

    [49] => Иванов?<br />

    [50] => Ага.<br />

    [51] => Этот 
    [52] => хороший! 
    [53] => В 
    [54] => прошлом 
    [55] => году 
    [56] => и 
    [57] => он 
    [58] => был 
    [59] => у 
    [60] => нас 
    [61] => папой.</p>
<img align='left' src='plus.gif'>
<p>***</p> 
)
</pre>
*/

?>

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования