|
|
|
|
|
для: .....
(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 , но там текст со скриншотов совсем не читаемый :) | |
|
|
|
|
|
|
|
для: 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>
*/
?>
|
| |
|
|
|
|
|
|
|
для: 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го. В примерах, приводимых мною по ссылкам, вставляется после предлога "на ", я там @@@ вывожу вместе с невидимым визуально тхис. | |
|
|
|
|
|
|
|
для: 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>";
?>
|
То есть, пробелы в тегах не затронуты. | |
|
|
|
|
|
|
|
для: Deed
(13.07.2011 в 12:52)
| | Усложнять точно не стоит. :-)
Я там только и понял, где точки на пробел заменить.
Но в данном контексте
$re='%\G(?:(?:<a\s.+?</a>)+|(?:<[^>]*>)+|[^.?!<]+)*[.?!]\.*%xis';
|
Куда подставить ?
Это же только исключение тэгов, насколько я понял? | |
|
|
|
|
 64.2 Кб |
|
|
для: tuder
(13.07.2011 в 12:00)
| | Ну, и зачем все так усложнять-то??
/(?!=<)[^<>'\*]+(?=<)/ | |
|
|
|
|
|
|
|
для: 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];
}
?>
|
И если посмотреть исходник, то ничего не теряется. | |
|
|
|
|
|
|
|
для: Deed
(13.07.2011 в 11:21)
| | Так в этой регулярке .|!|?, а не пробелы. | |
|
|
|
|
|
|
|
для: .....
(13.07.2011 в 00:10)
| | Спасибо. Работает. Интересно и коротко.
Почему-то у меня в питерском справочнике PHP4 Григина нет такой функции.
А тэги ссылок не нужно учитывать. Во-первых, в моём случае, текст предварительно обрабаывается с помощью strip_tags($content, "<img><p>"). Так что остаются только тэги форматирования текста. Но лучше убрать из подсчёта вообще всё то, что находится между угловыми скобками. | |
|
|
|
|