如何在字符串的给定位置突出显示/向字符添加标记


How to highlight/add tag to char in given position of a String

我有一个字符串:

$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";

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

$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";

然后用CCD_ 3或任何方法将str转换为数组。

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

这可能不快,但很直接:

实时演示

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和匿名函数来进一步"幻想"该过程。

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

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