我有一个字符串:
$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);