這裏主要講解的是從內容中提取關鍵文字作爲錨點使用,當然,其他場合也可以運用
/**
* 提取字符串中間的文字/自定義標籤中間文字
* @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']);