截断特定HTML标记内的文本

时间:2014-07-17 10:25:41

标签: php regex preg-replace preg-match substr

这可能甚至不可能,但我对PHP的了解非常有限,所以我无法弄清楚它是否存在。

基本上我有一个字符串$myText,这个字符串以下列格式输出HTML:

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

我的目标是限制<p>标记内显示的字符数,例如10个字符。

我一直在使用PHP substr,但我只能将其用于所有文本,而不仅仅是<p>标记中的文本。

你知道这是否可行,如果是的话,你知道怎么做吗?任何指针都会受到赞赏。

谢谢

2 个答案:

答案 0 :(得分: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');使其正常运作

答案 1 :(得分: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";  
}

这些将适用于任何标记及其中的任何类或属性。

离。输入:

<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>