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

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

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

 

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

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

тема: исключить html тэги из обработки
 
 автор: Anatoly_ua   (15.09.2008 в 17:32)   письмо автору
 
 

Хочу "почистить" html текст, например, убрать двойные пробелы, после знаков препинания (.!?,;) добавить пробел, каждое новое предложение начинать с большой буквы и т.п.
Вроде бы несложно, но есть проблема: внутри html тэгов может быть, например, точка, или знак вопроса, в общем, что-то, что менять не нужно. Можно ли как-то исключить из замены все, что находится внутри скобок < > (т.е. внутри тэгов)?

  Ответить  
 
 автор: AcidTrash   (15.09.2008 в 21:28)   письмо автору
 
   для: Anatoly_ua   (15.09.2008 в 17:32)
 

>и т.п.
Конечно все это интересно, но вы хотя бы привели бы свой вариант решения или в худшем случае кусок текста с комментариями, что и где надо почистить.

  Ответить  
 
 автор: Anatoly_ua   (15.09.2008 в 23:38)   письмо автору
 
   для: AcidTrash   (15.09.2008 в 21:28)
 

Ну так в том то и дело, что решения нет никакого. Я не знаю, как исключить из паттерна все, что может быть заключено в <>...
Вот, например, добавление пробела после [.!?,:;]:
<?php
echo preg_replace('/([.!?,:;])+(\w)/si''$1 $2''Пример со <a href=http://site.ru>ссылкой</a>,добавит пробел внутри ссылки,где он не нужен');
?>

  Ответить  
 
 автор: xx77   (16.09.2008 в 13:49)   письмо автору
 
   для: Anatoly_ua   (15.09.2008 в 23:38)
 

Задача нереализуема без заметной потери быстродействия скрипта
, и без применения нескольких алгоритмов
таких как:
1,разбор html-разметки с разбором вложенности кавычек
2, создание модели текста без html
3, смысловой анализ текста с целью выявления наличия умысла автора текста
, поставившего букву после точки

последние два пункта можно объеденить в один , те сделать одноаременное создание представления текста совмесно с смысловым анализом .)

а так даже в нижеприведённых простейших случаях , где множество валидного для браузеров и для грамматных читателей,
так-же подвергается девалидационизирующему преобразованию,
тоже время выдачи с обработкой заметно отличается от времени просто выдачи например посредством простого echo() , особенно в случаях обработки больших объёмов данных
<pre><?

$txt 
'<style>
.test { padding: 2.5em; }
</style>
Пример со <a href=http://site.ru>ссылкой</a>,добавит
 пробел внутри ссылки,где он не нужен (",\')- незаэкранировано 
<!-- <p class="test">
закомментировано
</p>-->
1.5 [[:alnum:]]+
<a onclick="(i>0)?return false: return true" href="http://site.ru/">>>></a>
'
;

$pattern '#(<!--.*?-->\s*|<script.+?</script>\s*|<style.+?</style>\s*|<[^>]*>\s*)#is';
$array preg_split($pattern$txt, -1
PREG_SPLIT_NO_EMPTY PREG_SPLIT_DELIM_CAPTURE);

foreach(
$array AS $str) {
if (
substr($str01) == '<') echo htmlspecialchars($str);
else echo 
preg_replace('#([\.,!\?:;]+)(?=\w)#''$1 '$str); 
echo 
"\n\n";
}
?><hr><?
$pattern 
'#([^<]*)((?:<!--.*?-->\s*|<script.+?</script>\s*|<style.+?</style>\s*|<[^>]*>\s*)+)#ise';

echo 
preg_replace($pattern'preg_replace(\'#([\.,!\?:;]+)(?=\w)#\', \'\$1\', \'$1\') . \'$2\''$txt); 
?>

здесь можно дополнительно ещё и убирать экранирование кавычек
, и лучше применить preg_replace_callback
, но всё это только если после текста есть хоть один тег

  Ответить  
 
 автор: Anatoly_ua   (16.09.2008 в 15:56)   письмо автору
 
   для: xx77   (16.09.2008 в 13:49)
 

Если без разбора html никак нельзя, то, боюсь, прийдется воздержаться от такой обработки... :(

За пример реализации -- спасибо!

  Ответить  
 
 автор: xx77   (16.09.2008 в 23:36)   письмо автору
 
   для: Anatoly_ua   (16.09.2008 в 15:56)
 

разбор кавычек в тегах не самое сложное

<? 
$text 
'1<img src="./images/1.gif" alt=">>>\"\"\">>>" width="200" height="18"> 
2<img src="2.gif" alt="\"\"\"\"" height="18"/> 
"3<img src=\"../3.gif\" alt='<\'img\'>'> 

4<img src="images/4.gif" title=">>>\'\'\'\'\'\'>>>"> 
'



$text preg_replace('#<[^\'">]*(?:([\'"])(?:(?!\1)\x5c?.)*\1[^\'">]*)*>#is',  ''$text); 

print 
htmlspecialchars($text);
/* скопировал из недавних тем */?> 


нереализуемость заключается больше в попытке съэммулировать програмно реализованого учителя грамматики , который ещё и понимает где есть блочные елементы html, а где просто слово в теге font. И что-бы не раздражал-бы читателя незнанием предмета изложенного в тексте.
Да и с кавычками , тоже потери милисикунд на килобайты

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

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