php在一个字符的随机位置中插入另一个字符串

我想实现这样的功能,在已有字符中插入内部链接,具体点说就是下面:

两个字符串分别为:$str1和$str2,是utf-8编码的,现在要把$str2插入到$str1的随机位置中,

$str1是带html标签的中英混合的字符串,要求$str2不能插入到$str1的html标签内,也不能插入到链接标签(a标签)封闭内。

不知道这样说,能不能理解,就是想在一段内容中随机插入几个链接文本

不知道怎么样才能实现这样的要求?

评论 (0)链接2012-06-22 
  
$str='打算的方式<a href="1.html">dffg</a>hyhyjhyjjya的风<p>asdasd</p>格的风格的风格的风格让他一人';
$link='<a href="#">内链</a>';//要插入的链接
preg_match_all("/(<a [^<>]*>.*<\/a>)|(<[^a><]+>)|(<\/[^a><]+>)/Uis",$str,$arr1);
$tmp = array_pad(array(), count($arr1[0]), 'yang@@@wo');
$str=str_replace($arr1[0],$tmp,$str);
$arr=explode('yang@@@wo',$str);
$rand=array_rand($arr);
$arr[$rand]=rand_in_str($arr[$rand],$link,'utf-8');
$str=implode('yang@@@wo',$arr);
$str=str_replace($tmp,$arr1[0],$str);
var_dump($str);

/**
* 向一个字符串随机插入一个字符串
* @param string $oldstr 老字符串
* @param string $instr 插入的字符串
* @param string $encoding 字符串编码
*/
function rand_in_str($oldstr,$instr,$encoding){
$len = mb_strlen($oldstr,$encoding);
$insert_point = mt_rand(1,$len-1);
$pre_str = mb_substr($oldstr,0,$insert_point,$encoding);
$after_str = mb_substr($oldstr,$insert_point,$len-$insert_point,$encoding);
$newstr = $pre_str.$instr.$after_str;
return $newstr;
}
share98
share98
50
编辑于 2012-06-24
该答案已被锁定,无法对其进行评论,编辑及投票。
()
评论 (2)链接 • 2012-06-22
  • 0 支持
    这个会将str1中原有的a标签去掉,并且将str1中除div之外的便签替换成div... – 冯义军 2012-06-24
  • 0 支持
    一开始就通过数组把a标签与其他的html标签储存到一个数组里了,最后都可以替换回来的 – share98 2012-06-24

这是刚才简单写了一个,你看看:

  
<?php
$str='字符串<a href="字g">dfg</a>aaaaaaaaaaaaaaaaaaaaaaaa啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊';
$strlen = mb_strlen($str,'utf8').'<br>';
$end = mt_rand(0,$strlen);
$rand_url_str = mb_substr($str,0,$end,'utf8')."<a href='#'>test</a>".mb_substr($str,$end,$strlen,'utf8');
//补充:
//下面就不写了,通过这个函数看看‘<’和‘>’出现的次数来确定需要过滤几个范围
substr_count($str, '<');
//在通过strpos对‘<’和‘>’的位置确定过滤范围,避免插入到其中
strpos($str,'<',$offet);//offet可以过滤已查找的范围

?>

后面你可以补充一下条件,我有事先下!

该答案已被锁定,无法对其进行评论,编辑及投票。
()
评论 (0)链接 • 2012-06-22

可以用正则将可以插入字符串的部分用正则或字符串截取函数截取出来,再将要插入的字符串随机插入一个位置即可,最后再连接一下就可以了。

该答案已被锁定,无法对其进行评论,编辑及投票。
()
评论 (0)链接 • 2012-06-22
德问是一个专业的编程问答社区,请 登录注册 后再提交答案