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

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

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

 

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

вид форума:
Линейный форум (новые сообщения вниз) Структурный форум

тема: php заменить не первое вхождение

Сообщения:  [1-10]    [11-20]  [21-21] 

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

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

  Ответить  
 
 автор: .....   (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 в 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>
*/

?>

  Ответить  
 
 автор: 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 в 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 в 14:31)   письмо автору
 
   для: Deed   (13.07.2011 в 12:52)
 

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

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


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

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

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

  Ответить  
 
 автор: 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];
}

?>


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

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

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

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

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

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

  Ответить  

Сообщения:  [1-10]    [11-20]  [21-21] 

Форум разработан IT-студией SoftTime
Rambler's Top100
вверх

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