提问者:小点点

使用preg_replace时锚定标签不起作用


views.php

 <a href="<?= URL::site(); ?>feeds/view/<?php echo $feed->feed_id; ?>"> 
 <p class="feed-text" style="word-wrap:break-word;">
     <?php if($feed_text = preg_replace('!(http|ftp|scp)(s)?:\/\/[a-zA-Z0-9.=?&_/]+!', "<a style=text-decoration:underline;color:blue href=\"\\0\" target='_blank' >\\0</a>",$feed->feed_text)):
     echo nl2br($feed_text);
     else:
     echo nl2br($feed->feed_text); endif;?>
 </p>
 </a>

上面的视图代码用于显示文本和url。如果用户只发布文本,则else部分将起作用,如果用户发布文本时同时发布url,则第一个条件起作用。

如果用户发布文本,点击该文本将把用户带到另一个页面。这也适用于如果用户发布两个文本与你管网址也。点击这里的文字,应该会把他带到下一个屏幕。

问题是,如果用户将文本与YouTube url一起发布,并且文本之间存在YouTube url,则YouTube url之后的文本将丢失锚定标记。但是,如果文章在文本后(文本结束后)包含管状链接,则锚定标记工作正常。

问题示例:

十只小猴子在床上跳 . . . 被泰迪熊绊倒,http://www.youtube.com/watch?v=38hnsgqf8O0在香蕉皮上滑倒,从码头上摔下来!

“在香蕉皮上滑倒,从码头上掉下来!”锚定标签不工作。其他案件的其他工作罚款。

如何解决这个问题


共1个答案

匿名用户

尝试添加display:block样式:

<a style="display:block;" href="<?= URL::site(); ?>feeds/view/<?php echo $feed->feed_id; ?>">

它只在HTML5中是正确的(参见Can a

但是当用户在文本中添加网址时,就不能这样做了。一个<代码>

然而,有一个方法可以做到这一点。您可以通过插入网址分割文本,并在中包装每个部分

<p>
  <a href="<?= URL::site(); ?>feeds/view/<?php echo $feed->feed_id; ?>">
    text_part_1
  </a>
  <a href="http://www.youtube.com/watch?v=38hnsgqf8O0">http://www.youtube.com/watch?v=38hnsgqf8O0</a>
  <a href="<?= URL::site(); ?>feeds/view/<?php echo $feed->feed_id; ?>">
    text_part_2
  </a>      
</p>