使用preg_replace无法使用锚标记

时间:2014-03-14 13:03:57

标签: javascript php kohana kohana-3

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>

上面的视图代码是显示文本和网址。如果用户仅发布文本,则else部分将起作用,如果用户将文本与管道URL一起发布,则第一个条件有效。

如果用户发布文本,点击该文本会将用户带到另一个页面。如果用户同时发布两个文本,也适用于管网址。如果单击文本,则应将他带到下一个屏幕。

问题是,如果用户将文字与你的管网址一起发布,如果你的管网址存在于文本之间,你管网址后的文字就会丢失锚标签。但是,如果帖子中包含你的管道链接文本(文本结束后),锚标记正常工作。

问题的例子:

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

&#34>在香蕉皮上滑倒,从码头上掉下来!&#34;锚标签不起作用。其他案例的工作正常。

如何解决这个问题

1 个答案:

答案 0 :(得分:0)

尝试将display:block;样式添加到锚标记:

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

仅在HTML5中有效(请参阅Can a <p> tag in <a> tag?

但是,如果用户在文本中添加了一个url,那么就无法通过这种方式完成。 <a>元素可能不是另一个<a>元素的后代。

然而,有一种方法可以做到这一点。您可以通过插入的URL拆分文本,并将每个部分包装在<a>包装器中。所以html将具有如下结构:

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