2014-07-17 5 views
2

Это может быть даже невозможно, но у меня довольно ограниченное знание PHP, поэтому я не могу понять, есть оно или нет.Обрезать текст внутри определенных HTML-тегов

В принципе у меня есть строка $myText и эта строка выводит HTML в следующем формате:

<p>This is the main bit of text</p> 
<small> This is some additional text</small> 

Моя цель состоит в том, чтобы ограничить количество отображаемых символов конкретно внутри <p> тега, например 10 символов.

Я играл с PHP substr, но я могу заставить это работать только на весь текст, а не только текст в теге <p>.

Знаете ли вы, возможно ли это, и если да, знаете ли вы, как это сделать? Любые указатели на всех были бы оценены.

Спасибо

+0

вы рассмотрели с помощью Java-плагин, как этот http://tpgblog.com/2009/12/21/threedots-the-jquery-ellipsis-plugin /, вместо этого? В противном случае вы можете вставить часть кода, который вы пробовали в PHP? ($ myText может иметь много абзацев. Как вы знаете, какие длинные ограничения ограничить?) – cornelb

+0

Привет, cornelb, я обновлю свой вопрос, чтобы включить некоторый код. $ myText будет иметь только 1 абзац. – DesignSubway

ответ

3

Самое простое решение:

<?php 
$text = ' 
<p>This is the main bit of text</p> 
<small> This is some additional text</small>'; 

$pos = strpos($text,'<p>'); 
$pos2 = strpos($text,'</p>'); 

$text = '<p>' . substr($text,$pos+strlen('<p>'),10).substr($text,$pos2); 

echo $text; 

, но он будет работать только для первой пары <p> ... </p>

Если вам нужно больше, вы можете использовать регулярные выражения:

<?php 

$text = ' 
<p>This is the main bit of text</p> 
<small> This is some additional text</small> 

<p> 

werwerwrewre 

</p>'; 


preg_match_all('#<p>(.*)</p>#isU', $text, $matches); 


foreach ($matches[1] as $match) { 
    $text = str_replace('<p>'.$match.'</p>', '<p>'.substr($match,0,10).'</p>', $text); 

} 

echo $text; 

или даже

<?php 

$text = ' 
<p>This is the main bit of text</p> 
<small> This is some additional text</small> 

<p> 

werwerwrewre 

</p>'; 



$text = preg_replace_callback('#<p>(.*)</p>#isU', function($matches) { 
$matches[1] = '<p>'.substr($matches[1],0,10).'</p>'; 
return $matches[1]; 
}, $text); 

echo $text; 

Однако в этих всех 3-х случаях, все белые символы считаются как часть строки, так что если содержание <p>...</p> начинается с 3-пространства, и вы хотите отобразить только 3 символов, вы просто отображение только 3 места, больше ничего. Конечно, его можно легко изменить, но я упомянул об этом, чтобы заметить этот факт.

И еще одна вещь, вполне возможно, что вам нужно будет использовать многобайтовую версию функций, чтобы получить результат, так, например, вместо strpos() вы должны использовать mb_strpos() и установить ранее UTF-8 кодирование с использованием mb_internal_encoding('UTF-8');, чтобы сделать его работу

+0

Спасибо, Марцин Набиялек. – DesignSubway

0

Вы можете достичь его довольно простым способом:

<?php 

$max_length = 5; 
$input = "<b>example: </b><div align=left>this is a test</div><div>another very very long item</div>"; 
$elements_count = preg_match_all("|(<[^>]+>)(.*)(</[^>]+>)|U", 
    $input, 
    $out, PREG_PATTERN_ORDER); 
for($i=0; $i<$elements_count; $i++){ 
    echo $out[1][$i].substr($out[2][$i], 0, $max_length).$out[3][$i]."\n"; 
} 

это будет работать для любого тега и любого класса или атрибута внутри него.

ex. вход:

<b>example: </b><div align=left>this is a test</div><div>another very very long item</div> 

выход:

<b>examp</b>  
<div align=left>this </div>  
<div>anoth</div> 
Смежные вопросы