0

我有一个字符串:

$str="55798-45366-11255-48084-35644-28027-85391-45536-85002-55350-4166-5991-0313-3681-9382-9143-2852-8142-8643-0235-875-383-839-92-91-00-81";

我想<font color=red> </font>在上面字符串中任何位置 x 和 y 的字符之前和之后添加标签(如:),但不包含“ -”拆分字符,如:

$str2="55798453661125548084356442802785391455368500255350416659910313368193829143285281428643023587538383992910081";

在位置 x=5 & y=8 添加标签:

55798<font color=red>4</font>53<font color=red>6</font>61125548084356442802785391455368500255350416659910313368193829143285281428643023587538383992910081

$str="55798-<font color=red>4</font>53<font color=red>6</font>6-11255-48084-35644-28027-85391-45536-85002-55350-4166-5991-0313-3681-9382-9143-2852-8142-8643-0235-875-383-839-92-91-00-81";

然后将 str 转换为数组 byexplode("-", $str);或 anny 方式转换为数组。

我尝试了很多substr_replace($str2,"<font color=red>$str2[$x]</font>",$x,1);但失败了。我不知道如何,请帮助

4

2 回答 2

0

将标签添加到某个位置很简单:

$str = substr($str, 0, $x) . sprintf('<tag>%s</tag>', $str[$x]) . substr($str, $x+1);

于 2013-08-23T08:56:31.100 回答
0

这可能不是很快,但它非常简单:

现场演示

function tag($str,$pos1,$pos2)
{
    $offset=-1;
    $arrs=explode("-",$str);
    list($pos1,$pos2)=array(min($pos1,$pos2),max($pos1,$pos2));
    foreach($arrs as &$chunk)
    {
        $len=strlen($chunk);
        if($offset+1>$pos2) break;
        if($offset+1<=$pos2 && $offset+$len>=$pos2)
        {
            $chunk=substr($chunk,0,$pos2-$offset-1)."<span style='color:red'>".substr($chunk,$pos2-$offset-1,1)."</span>".substr($chunk,$pos2-$offset);
        }
        if($offset+1<=$pos1 && $offset+$len>=$pos1)
        {
            $chunk=substr($chunk,0,$pos1-$offset-1)."<span style='color:red'>".substr($chunk,$pos1-$offset-1,1)."</span>".substr($chunk,$pos1-$offset);
        }
        $offset+=$len;
    }
    return $arrs;
}

想法是首先分解字符串,并使用偏移记忆来“模拟”substr搜索。

您可能希望反向迭代该过程,因为代码必须首先检查更高的位置(否则第二个的位置substr将不正确)。

您还可以通过使用array_walk和匿名函数进一步“看中”该过程。

于 2013-08-23T09:47:42.613 回答