PHP按順序替換內容、正則按順序批量替換、自定義標籤替換

這裏主要講解的是從內容中提取關鍵文字作爲錨點使用,當然,其他場合也可以運用

 


/**
 * 提取字符串中間的文字/自定義標籤中間文字
 * @param $str
 * @param string $regex
 * @return mixed
 */
function extCustomLabel($str,$regex=''){
	$preg = empty($regex) ? '#\[a](.*?)\[\/a]#i' : $regex ;
	preg_match_all($preg,$str,$res);
	return $res;
}


/**
 * 自定義標籤格式化字符串方式替換(按順序替換)
 * @param $str
 * @param string $old_start
 * @param string $old_end
 * @param string $new_start
 * @param string $new_end
 * @param string $regex
 * @param string $pattern
 * @param array $arr
 * @return array
 */
function cusLabelRepStr($str,$old_start='[a]',$old_end='[/a]',$new_start='<span %s >',$new_end='</span>',$regex='',$arr=array()){
	$res = extCustomLabel($str,$regex);
	if (empty($res[1])){return array('str'=>$str,'arr'=>array());}
	if (empty($arr)){
		foreach ($res[1] as $k=>$v){
			$arr[] = 'id="maodian_'.$k.'"';
		}
	}

	$newstr = str_replace(array($old_start,$old_end),array($new_start,$new_end),$str);
	$arrs = $arr;
	array_unshift($arrs,$newstr);  //向數組插入新元素,新數組的值將被插入到數組的開頭。
	$repstr = call_user_func_array('sprintf',$arrs);//把一個數組作爲函數的參數

	return array('str'=>$repstr,'arr'=>$res[1]);
}


//調用函數
$str = '[a]abc[/a]defg [a]字母[/a] hijklmn [a]拼音[/a] OPQ rst [a]五筆[/a] [a]uVW[/a] Xyz';
$row = cusLabelRepStr($str);
print_r($row);

 

正則方式↓


/**
 * 自定義標籤正則批量替換(按順序替換)
 * @param $str
 * @param string $regex
 * @param string $pattern
 * @return array
 */
function cusLabelRepStr_s($str,$old_end='[/a]',$start='<span val >',$new_end='</span>',$regex='',$pattern = '/\[a\]/',$arr=array()){
	$res = extCustomLabel($str,$regex);
	if (empty($res[1])){return array('str'=>$str,'arr'=>array());}
	$patternarr = is_array($pattern) ? $pattern : array();
	if (empty($arr)){
		foreach ($res[1] as $k=>$v){
			$patternarr[] = $pattern;
			$arr[] = str_replace('val','id="maodian_'.$k.'"',$start);
		}
	}
	$preg_rep = preg_replace($patternarr,$arr,$str,1);/* 批量按順序替換 */
	$repstr = str_replace($old_end,$new_end,$preg_rep);

	return array('str'=>$repstr,'arr'=>$res[1]);
}


//調用函數
$str = '[a]abc[/a]defg [a]字母[/a] hijklmn [a]拼音[/a] OPQ rst [a]五筆[/a] [a]uVW[/a] Xyz';
$row = cusLabelRepStr_s($str);
print_r($row);





/**
 * 自定義內容替換(按順序替換)
 * @param $dataarr
 * @param $str
 * @param string $start
 * @param string $end
 * @param string $regex
 * @return array
 */
function cusContentRepStr_s($dataarr,$str,$start='<span val >',$end='</span>',$regex=''){
	if (empty($dataarr)){
		return $str;
	}
	$regex = empty($regex) ? '#\<span .*?id="idposition_(.*?)".*?>(.*?)\<\/span>#i' : $regex ;
	$pattern = array();
	$replacement = array();
	foreach ($dataarr as $key=>$val){
		$pattern[] = '/'.$val.'/i'; /* i 不區分大小寫 */
		$repstart = str_replace('val','id="idposition_'.$key.'"',$start);
		$replacement[] = $repstart.$val.$end;
	}
	$res = preg_replace($pattern, $replacement, $str , 1);/* 批量替換內容 */

	preg_match_all($regex, $res,$ms);/* 批量提取指定內容 */

	return array('str'=>$res,'arr'=>$ms);
}


//調用函數
$arr = array('abc','字母','拼音','五筆','uVW');
$str = '【abc】defg [字母] hijklmn [拼音] OPQ rst [五筆] 【uVW】 Xyz';
echo $str.'<br><hr><br>';
$row = cusContentRepStr_s($arr,$str);
print_r($row['str']);
echo $str.'<br><br>';
print_r($row['arr']);

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章