|
|
|
| Хочу "почистить" html текст, например, убрать двойные пробелы, после знаков препинания (.!?,;) добавить пробел, каждое новое предложение начинать с большой буквы и т.п.
Вроде бы несложно, но есть проблема: внутри html тэгов может быть, например, точка, или знак вопроса, в общем, что-то, что менять не нужно. Можно ли как-то исключить из замены все, что находится внутри скобок < > (т.е. внутри тэгов)? | |
|
|
|
|
|
|
|
для: Anatoly_ua
(15.09.2008 в 17:32)
| | >и т.п.
Конечно все это интересно, но вы хотя бы привели бы свой вариант решения или в худшем случае кусок текста с комментариями, что и где надо почистить. | |
|
|
|
|
|
|
|
для: AcidTrash
(15.09.2008 в 21:28)
| | Ну так в том то и дело, что решения нет никакого. Я не знаю, как исключить из паттерна все, что может быть заключено в <>...
Вот, например, добавление пробела после [.!?,:;]:
<?php
echo preg_replace('/([.!?,:;])+(\w)/si', '$1 $2', 'Пример со <a href=http://site.ru>ссылкой</a>,добавит пробел внутри ссылки,где он не нужен');
?>
|
| |
|
|
|
|
|
|
|
для: 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($str, 0, 1) == '<') 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
, но всё это только если после текста есть хоть один тег
|
| |
|
|
|
|
|
|
|
для: xx77
(16.09.2008 в 13:49)
| | Если без разбора html никак нельзя, то, боюсь, прийдется воздержаться от такой обработки... :(
За пример реализации -- спасибо! | |
|
|
|
|
|
|
|
для: 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. И что-бы не раздражал-бы читателя незнанием предмета изложенного в тексте.
Да и с кавычками , тоже потери милисикунд на килобайты | |
|
|
|