substr函数显示不正确

时间:2013-12-23 07:37:01

标签: php joomla

我正在使用这样的substr()函数:

<a href="#">link</a>
<?php echo substr($item->introtext,0,75);?>
<a href="#">read-more</a>

当introtext超过75个字符时,它显示不正确:

<a href="#">link</a>
<p>introtext paragraphs here<a href="#">read-more</a></p>

但是当introtext少于75个字符时,它正确地显示如下:

<a href="#">link</a>
<p>introtext paragraphs here</p>
<a href="#">read-more</a>

请注意,当introtext超过75个字符时,read-more在p内,但在少于75个字符时则不在。

我的整个代码在这里:

<ul class="latestnews<?php echo $moduleclass_sfx; ?>">
<h3>news</h3>
<?php foreach ($list as $item) :  ?>

    <li>
        <a href="<?php echo 'index.php?option=com_content&view=article&id='.$item->id; /* echo $item->link;*/ ?>">
            <?php echo $item->title; ?></a>
          <?php echo substr($item->introtext,0,75);?>
          <br /><a class="learn-more" href="<?php echo 'index.php?option=com_content&view=article&id='.$item->id; //* echo $item->link;*/ ?>">learn more</a>
    </li>
<?php endforeach; ?>
</ul>

3 个答案:

答案 0 :(得分:1)

原因

$item->introtext 少于75个字符时,结束标记</p>肯定在75个字符内,因此结构将是 -

<p>paragraph content</p>
<a href="#">read-more</a>

但是当$item->introtext 超过75个字符时,</p> - 函数返回的字符串中的结束标记substr()肯定不存在。因此结果如下 -

<p>paragraph content<a href="#">read-more</a>
//As closing tag </p> is not there hence the link "read-more" is considered inside the <p>..</p> scope.

解决方案

<?php echo substr($item->introtext,0,75);?>导致问题。

所以你可以做一件事,即剥去文本中的所有标签,以便substr()不计算标签样式声明并申请之后所有必要的风格。所以将代码更改为 -

<?php echo substr(strip_tags($item->introtext),0,75);?>

答案 1 :(得分:0)

问题在于<p>标签似乎实际上在内部文字中。

因此,要解决此问题,您需要从字符串末尾修剪结束标记。

<ul class="latestnews<?php echo $moduleclass_sfx; ?>">
<h3>news</h3>
<?php foreach ($list as $item) :  ?>

    <li>
        <a href="<?php echo 'index.php?option=com_content&view=article&id='.$item->id; /* echo $item->link;*/ ?>">
            <?php echo $item->title; ?></a>
          <?php echo substr(rtrim($item->introtext,"</p>"),0,75);?>
          <br /><a class="learn-more" href="<?php echo 'index.php?option=com_content&view=article&id='.$item->id; //* echo $item->link;*/ ?>">learn more</a>
          </p>
    </li>
<?php endforeach; ?>
</ul>

以上代码将移除结束</p>代码,并在了解更多链接结束后创建另一个代码。

祝你好运

答案 2 :(得分:0)

Joomla具有内置函数,用于智能修剪诸如介绍文本之类的内容:JHtmlString :: truncate(),JHtmlString :: truncateComplex(),JHtmlString :: abridge()。我会使用truncateComplex,因为你可能需要渲染75个字符,但不要将html计算为字符。