这可能甚至不可能,但我对PHP的了解非常有限,所以我无法弄清楚它是否存在。
基本上我有一个字符串$myText
,这个字符串以下列格式输出HTML:
<p>This is the main bit of text</p>
<small> This is some additional text</small>
我的目标是限制<p>
标记内显示的字符数,例如10个字符。
我一直在使用PHP substr,但我只能将其用于所有文本,而不仅仅是<p>
标记中的文本。
你知道这是否可行,如果是的话,你知道怎么做吗?任何指针都会受到赞赏。
谢谢
答案 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>