我正在尝试通过字符串扫描特定标签,并用格式正确的html替换它们。 例如,我想用
替换图像ID到目前为止我有这个扫描字符串并返回一个包含标签内的id的数组
function get_image($string, $start, $end) {
$start = preg_quote($start, '|');
$end = preg_quote($end, '|');
$matches = preg_match_all('|'.$start.'([^<]*)'.$end.'|i', $string, $output);
return $matches > 0
? $output[1]
: array();
}
$output = get_image($string,'<img>','</img>');
for($x = 0; $x < count($output); $x++){
$id = mysqli_real_escape_string($con,$output[$x]);
$sql = "SELECT * FROM images WHERE image_id = '$id'";
$query = mysqli_query($con,$sql);
$result = mysqli_fetch_assoc($query);
$replacement = '<img src="'.$result['img_src'].'" width="'.$result['img_width'].'" height="'.$result['img_height'].'" />';
}
$ string
的例子字符串的示例将是这样的一些文本 然后是图像
<img>1</img>
还有一些文字
所以我现在有了这个id的数组,可用于从数据库获取图像src宽度高度。但无法弄清楚如何用新标签替换旧标签。
我可以使用for循环来格式化数组中的每个条目,但是如何在字符串中的正确位置用新格式化的文本替换标记。
答案 0 :(得分:1)
您可以使用preg_replace_callback():
来使用类似的内容// Get info of image $id
function getImageById($id){
$sql = "SELECT * FROM images WHERE image_id = '$id'";
return mysqli_query($con,$sql)->fetch_assoc();
}
// Proccess the info the regex gives and wants
function getImageById_regex($matches){
// Some function to get the src by the id
$img = getImageById( $matches[1] );
return '<img src="'.$img['src'].'" alt="'.$img['alt'].'" />';
}
// The actual magic:
$string = preg_replace_callback("/<img>(.*?)<\/img>/", "getImageById_regex", $string);
在此版本中,getImageById()
返回一个包含info的数组,但您可以更改它并使其返回整个图像html。
可以改进:
// The actual magic, but first use a fast method to check if the slow regex is needed:
if( strpos($string, '<img>')!==false){
$string = preg_replace_callback("/<img>(.*?)<\/img>/", "getImageById_regex", $string);
}
提示:查看一些BB代码脚本。他们的工作方式相似