在php中,将一行文本拆分为没有任何明显断点的行[第2部分]

在php中,将一行文本拆分为没有任何明显断点的行[第2部分],php,scripting,programming-languages,formatting,Php,Scripting,Programming Languages,Formatting,我在这里得到了三个非常有用的答案: 它似乎添加了true作为wordwrap的选项,修复了这个问题,但它严重破坏了另一个函数,我无法使用它。该函数与此问题的思路相同,它获取长URL并将锚文本截断为“短URL” 你知道为什么wordwraptrueaddition会破坏这一点吗?我看到在“短URL”后面打印的URL设置限制之后的任何字符,这很奇怪 function long_links($stringa){ $m = preg_match_all('/(www\.|http:\/\/|http

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

它似乎添加了
true
作为
wordwrap
的选项,修复了这个问题,但它严重破坏了另一个函数,我无法使用它。该函数与此问题的思路相同,它获取长URL并将锚文本截断为“短URL”

你知道为什么wordwrap
true
addition会破坏这一点吗?我看到在“短URL”后面打印的URL设置限制之后的任何字符,这很奇怪

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;
 }
函数长链接($stringa){
$m=preg\u match\u all('/(www.\.\http:\/\/\/\124; https:\/\/)([^\s]+)/',$stringa,$match);
如果($m){$links=$match[0];
对于($j=0;$j 59){
$stringa=STRU替换($loco,,$stringa);
} 
} 
返回$stringa;
}
为什么这会中断
$body=wordwrap($body,83,“\n”,true);回声体

我看到的溢出的一个例子是:

*短URL*条件/产品和服务/奖金银行/index.htm

根据马丁的问题进行编辑

$body=长链接($body)$body=wordwrap($body,83,“\n”,true);回声体


再次感谢

首先,请看一下。在那里,在用户提供的注释一节中,您可以找到wordwrap函数的代码,该函数去掉所有html标记,wordwrap其余部分并将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

-和服务/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);
$teststring='';
echo wordwrap($teststring,83,“\n”,true);
如果你已经这样做了,请把结果的html代码,因为它是代码,进入你的问题


尝试此功能(从):

这里有代码,但质量不好

我没试过,但如果成功的话,你很幸运,对吧


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

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);
}
函数获取标签数组($str)
{
//给定一个字符串,返回一个在其自身元素中包含html标记的序列数组
$q='?';
返回preg_split(“/()/”,$str,-1,preg_split_DELIM_CAPTURE | preg_split_NO_EMPTY);
}
函数html\u combi\u wordwrap($str,$width=75,$break=“\n”,$cut=false)
{
$tag\u arr=get\u tags\u数组($str);
foreach($tag\u arr as$key=>$tag\u str)
{
如果(预匹配(“/”,$tag\u str))
持续
$tag_arr[$key]=wordwrap($tag_str,$width,$break,$cut);
}
返回内爆($tag_arr);
}

这结合了(只有没有html标记的包装文本)和常规的wordwrap函数的思想,该函数仍然可以被utf-8变体或其他什么替换…

您在哪里调用
long\u links()
函数(关于您问题中的
$body=…
行)?您确定long\u links()在添加换行符之前工作过吗?你所说的功能现在“坏了”是什么意思?请你给我们看一下包装好的长链接的html代码。谢谢,Martin:
-和services/bonus bank/index.htm
。当我将
长链接
的顺序与和
wordwrap
交换时,短链接仍然有效,但所有非短链接都失败了,即只是文本而不是“HREF”。看看我的答案,太长了,无法发表评论,但可能无法100%回答您的问题……感谢您的帮助,Martin。如果你知道我的意思的话,你的最后一个片段正是导致第二个片段的原因。换句话说,你的第三个代码片段正是我所拥有的,它破坏了短链接输出并导致文本溢出。这有什么启示吗?谢谢,我已经尝试了手册页上的一些,但没有成功:(@JonathanRoss让我们看看,我今天晚些时候或者明天有时间。再次感谢!!