分解一行文本 - 没有任何可辨别的断点 - 在PHP中[第2部分]

时间:2011-07-13 07:11:17

标签: php scripting programming-languages formatting

我在这里收到了三个非常有用的答案:

Break up one line of text without any discernible break points in PHP

似乎添加了true作为wordwrap的选项解决了问题,但它破坏了另一个功能,我不能使用它。该函数与此问题一脉相承,并抓取长URL并将锚文本截断为“Short URL”。

为什么wordwrap true添加会破坏这一点的任何想法?我看到在“短网址”之后打印的网址设置限制之后的任何字符都很奇怪。

function long_links($stringa){

$m = preg_match_all('/(www\.|http:\/\/|https:\/\/)([^\s]+)/', $stringa, $match);

 if ($m){ $links=$match[0]; 

      for ($j=0;$j<$m;$j++){

       $loco=$links[$j]; $len=strlen($loco);

         if($len > 59){

        $stringa = str_replace($loco,'<a href="'.$loco.'" title="'.$loco.'" target=_blank><i>Short Link</i></a>',$stringa); 
   } 
  } 
  return $stringa;
 }

为什么会中断$body = wordwrap($body, 83, "\n", true); echo $body;

我看到的漏油事件的一个例子是:

*Short URL* conditions/products-and-services/bonus-bank/index.htm

按照马丁的提问编辑

$body=long_links($body); $body = wordwrap($body, 83, "\n", true); echo $body;

再次感谢!

1 个答案:

答案 0 :(得分:0)

首先,看看wordwrap man page。在那里,在用户贡献的笔记部分,你可以找到一个wordwrap函数的代码,它取出所有的html标签,wordwraps其余部分并重新放入html标签。

然后回答您的问题,尝试调试一下并通过编辑问题分享您的结果。试一试:

提供的示例应如下所示:

<a href="http://www.vodafone.co.uk/vodafone-uk/about-this-site/terms-and-conditions/products-and-services/bonus-bank/index.htm" 
   title="http://www.vodafone.co.uk/vodafone-uk/about-this-site/terms-and-conditions/products-and-services/bonus-bank/index.htm" 
   target=_blank><i>Short Link</i></font></a> 

但看起来像这样,对吗?

<a href="http://www.vodafone.co.uk/vodafone-uk/about-this-site/terms-and-conditions/products" 
   title="http://www.vodafone.co.uk/vodafone-uk/about-this-site/terms-and-conditions/products" 
   target=_blank><i>Short Link</i></font></a> 
-and-services/bonus-bank/index.htm

所以,首先看看wordwrap对此做了什么:

$teststring = '<a href="http://www.vodafone.co.uk/vodafone-uk/about-this-site/terms-and-conditions/products-and-services/bonus-bank/index.htm" 
   title="http://www.vodafone.co.uk/vodafone-uk/about-this-site/terms-and-conditions/products-and-services/bonus-bank/index.htm" 
   target=_blank><i>Short Link</i></font></a>';
echo wordwrap($teststring, 83, "\n", true);

如果您已经这样做了,请将结果的html代码作为代码放入您的问题中。


尝试此功能(来自the php man page for wordwrap):

这里有代码,但质量不高

我没有测试它,但如果它有效,你很幸运,对吧?


现在你让我尝试了一下,这是我的结果:

function get_tags_array($str)
{
    //given a string, return a sequential array with html tags in their own elements
    $q = '?';
    return preg_split("/(<.*$q>)/",$str, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);
}

function html_combi_wordwrap($str, $width = 75, $break = "\n", $cut = false)
{
    $tag_arr = get_tags_array($str);
    foreach($tag_arr as $key => $tag_str)
    {
        if(preg_match("/<.*>/", $tag_str))
            continue;

        $tag_arr[$key] = wordwrap($tag_str, $width, $break, $cut);
    }
    return implode($tag_arr);
}

这结合了this code的概念(也就是说,只包装没有html标签的文本)和常规的wordwrap函数,它仍然可以被utf-8变体或其他任何东西取代......