2016-01-29 6 views
2

Длинный текст содержит некоторые HTML-теги (уш, IMG и т.д.)Split длинный текст с HTML в задира и основную часть

Этот текст нужно тизер с максимум 400 символов и заботиться о словах и html-теги но теги br должны быть заменены пробелом, чтобы удалить разрывы строк в тизер. Выглядит лучше!

Текст после тизера должен быть текст минус тизер, но со всеми HTML-теги и изображения включены бр

Example text: 

Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. <img alt="image" src="/image.jpg"> At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. 
<br /><br /> 
Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. <img alt="image" src="/image.jpg"> Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. 
<br /><br /> 
Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, <img alt="image" src="/image.jpg"> vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet. 

Что я пробовал:

$content = $junk_of_lorem; 

function teaser($string){ 
$string = substr($string,0,500); 
$string = substr($string,0,strrpos($string," ")) 

$replacements = array(
    '|<br /><br />|' => ' ' 
); 

$patterns = array_keys($replacements); 
$replacements = array_values($replacements); 

$string = preg_replace($patterns, $replacements, $string); 

return $string; 
} 

$teaser = teaser($content); 

Теперь я попытался удалите $ teaser из текста, чтобы получить текст без тизера

$mainpart = str_replace(teaser($content), "", $content); 

Проблема:

с этим фиктивным решением, я столкнулся с проблемами, потому что тизер только с br, а у основной части есть все теги html. Когда есть изображение arround char 490, основная часть содержит половину тега img.

strip_tags, разрешающий работать с тизеры, но я не могу удалить точное соответствие из $ mainpart.

Я уверен, что есть лучшее решение. Извините за меня английские ошибки, пожалуйста, не проголосуйте меня. Я изо всех сил объяснил это.

Большое спасибо за ваше время, чтобы помочь мне.

+0

Для тизер, используйте strip_tags перед тем зиЬзЬги http://php.net/manual/fr/function.strip-tags.php –

+0

но когда тизер не имеет HTML-тегов больше, но mainpart должны, я не могу заменить тизерная часть из основного текста, потому что не соответствует. – labu77

+0

Вот что я нашел об усечении текста и HTML: http://www.pjgalbraith.com/truncating-text-html-with-php/ –

ответ

0

Хорошо, поэтому я возился с этим и думал, что у меня может быть что-то, что сработает для вас.

Учитывая вашу строку, как это:

$string = 'Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. <img alt="image" src="/image.jpg"> At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. 
<br /><br /> 
Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. <img alt="image" src="/image.jpg"> Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. 
<br /><br /> 
Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, <img alt="image" src="/image.jpg"> vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet.'; 

Мы могли бы написать preg_match заявление, используя PREG_OFFSET_CAPTURE флаг отметить позицию матча, как это:

preg_match('~([A-z0-9 ,.]|<.*?>){1,158}(?=\s+)~', $string, $matches, PREG_OFFSET_CAPTURE); 

Где я имею {1,158}, вы можете изменить 158, чтобы быть какой бы ни была ваша тизер. Количество символов не будет ровно 400 или ровно 500, но оно должно быть около этого числа. Например, если у вас есть HTML-теги, они занимают больше места и будут считаться только одним из наших персонажей. (. Потому что я говорю это, чтобы дать мне либо символ или HTML теги - 158 раз)

$matches будет содержать и массив как это:

Array 
(
    [0] => Array 
     (
      [0] => Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua 
      [1] => 0 
     ) 

    [1] => Array 
     (
      [0] => a 
      [1] => 155 
     ) 

) 

Таким образом, мы хотим $matches[0][0] для текста и $matches[1][1] за место, где мы остановились.

Теперь давайте рассмотрим информацию, которую мы имеем, и определить некоторые переменные, которые мы можем использовать позже:

$teaser = $matches[0][0]; 
$capture_position = $matches[1][1] + 1; 
$body = substr($string, $capture_position); 

Сразу отметят, что мы увеличиваем $matches[1][1] один, потому что мы хотим начать с символом после матча ... не последний символ соответствует.

Далее мы определили $body, используя substr, чтобы получить текст, начинающийся с $capture_position.

Наконец, мы можем просто распечатать наши $teaserstrip_tags) и $body:

print '<b>'.strip_tags($teaser).'</b>'; 
print '<br><br>'.$body; 

Вот рабочий пример:

http://ideone.com/yqiTlq

А вот регулярное выражение для вас поиграть и посмотреть, как изменение 158 влияет на общую сумму захваченной строки:

https://regex101.com/r/iZ9lX1/1

Объяснение([A-z0-9 ,.]|<.*?>){1,158}(?=\s+)

  • ([A-z0-9 ,.]|<.*?>) Это захват группы (...), которая будет содержать наш тизер и состоит из двух элементов. Первый - класс символов [ ... ], состоящий из прописных и строчных букв A-z, номера 0-9, пробел , запятая , и период .. Труба | является символом «ИЛИ». Второй предмет ищет меньше, чем знак <, за которым следует любой символ ., любое количество раз *, пока не попадет в следующую часть нашего матча ?. Следующая часть нашего матча будет больше знака >. Это должно соответствовать любому тегу HTML.
  • {1,158} Это диапазон, определяемый начальным номером 1 и проходящий через 158. Все это означает, что все, что мы сопоставляли прямо перед ним (символ или тег html), должно быть найдено хотя бы один раз, но не более 158 раз.
  • (?=\s+) Это взгляд (?= ...), говорящий, что символ пробела \s должен быть найден хотя бы один раз + после матча.
+0

Большое спасибо за ваше время и усилия, чтобы помочь мне с этой проблемой. Я попробовал это, и он работает, поскольку над точкой останова нет тега html. Когда добавьте labu77

+0

Hmmm, alright, well I was having trouble replicating your problem, however, you can just add something to the "OR" part of it. Like you can add '|.*? 'в качестве третьего варианта. Это будет искать тег открытия ссылки через тег закрытия ссылки. Вот все: '([A-z0-9,.] | <.*?> | . *?) {1,222} (?= \ S +) « – Quixrick

+0

-не получит эту работу. Возьмите этот пример текст: $ строки = «Lorem Ipsum морковь, consetetur sadipscing на протяжении многих лет, но длинный бросок nonumy руды и др боль была наиболее интересной, но диаметр проекта. @Thomas. «; установить число до 200 и посмотреть на HTML. – labu77

 Смежные вопросы

  • Нет связанных вопросов^_^