Обрезка текста, содержащего html, до заданной длины с закрытием тегов

mr_yurch

Новичок
Обрезка текста, содержащего html, до заданной длины с закрытием тегов

Здравствуйте. Подскажите, как решить задачу!
Из формы(элемент формы - визуальный редактор, например ckeditor) в php-скрипт приходит html.
PHP:
$str = '<p><b>Some text. Some text. Some text.</b></p>
<p>Lorem Ipsum has been the industry\'s standard dummy text. </p>
<p>Ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book.</p>';
$max_length = 15; // Максимально допустимое количество символов
Необходимо обработать строку $str так, чтобы:
1. Длина видимого в обозревателе текста не превышала $max_length. То есть в данном примере Some text. Some

2. Все теги были закрыты
PHP:
$cutted_str = '<p><b>Some text. Some</b></p>';
3. При задании символа или сочетания символов резать до первого вхождения после $max_length То есть в данном примере, если
PHP:
$symbol = '.';
То
PHP:
$cutted_str = '<p><b>Some text. Some text.</b></p>';
И видимый текст Some text. Some text.
 

QQQ

Новичок
Эх, добрый я сегодня

Код:
$Tags = array();
$in_tag = false;
$new_str = '';
$tag_name = '';
$close = false;

for($i = 0; $i < strlen($str); $i++)
{
	if($str{$i} == '<')
	{
		$in_tag = true;
		$i++;
	}

	if($in_tag)
	{
		if($str{$i} == '/')
		{	
			$close = true;
			$i++;
		}

		if($str{$i} == '>')
		{
			$tag_name = strtolower($tag_name);
			if(!isset($Tags[$tag_name])) $Tags[$tag_name] = 0;
			
			if($close) 
			{
				$Tags[$tag_name]--;
				$new_str .= '<'.$tag_name.'/>';
			}
			else 
			{
				$Tags[$tag_name]++;
				$new_str .= '<'.$tag_name.'>';
			}

			$close = false;
			$tag_name = '';
			$in_tag = false;

		}
		else
		{
			$tag_name .= $str{$i};
		}
		
		continue;
	}

	$new_str .= $str{$i};
	if(strlen($new_str) == $max_length) break;
}

foreach($Tags as $tag_name => $count)
{
	if($count <= 0) continue;

	for($i = 0; $i < $count; $i++)
	{
		$new_str .= '<'.$tag_name.'/>';
	}
}
код я не проверял, поэтому в работоспособности не ручаюсь, но смысл должен быть ясен
 

mr_yurch

Новичок
Спасибо за ответ, но не работает
PHP:
$str = '<p><b>Some text. Some text. Some text.</b></p>';
в результате
PHP:
$result = '<p><b>Some text<p/><b/>'
PHP:
$str = '<p class="my_class"><b>Some text. Some text. Some text.</b></p>';
в результате
PHP:
$result = '<p class="my_class"><b>Some text. Some text. Some text.<b/><p/><p class="my_class"/>'
 
Сверху