PHP 替换只工作一次
PHP replace only working once
我有一个包含来自表单($postContent)的 html 的字符串。我想为每张图片分配一个唯一的 ID。
我有以下代码:
$numImages=substr_count($postContent, '<img');
for($o=0; $o<$numImages; $o++){
$pos = strpos($postContent,"<img");
$postContent = substr_replace($postContent,"<img id='$o' height='50px' onclick='resize(\"$o\")' ",$pos,4);
}
对于第一次出现的标签,它工作正常,但对于其余的,它不起作用。
进一步说明:
<div><img src="http://image1"><img src="image2"></div>
通过我的代码后,它给出了这个:
<div>
<img id='1' height='50px' onclick='resize("1")' id='0' height='50px'
onclick='resize("0")' src="http://image1"><img src="http://image2"></div>
有人知道问题出在哪里吗?
您对 strpos
的调用总是找到 <img
的第一个实例。您需要使用第三个参数将其偏移前一个 <img
的位置加一。见 manual entry for strpos.
所以这段代码对我有用:
$postContent = '<div><img src="http://image1"><img src="image2"><img src="image3"></div>';
$numImages=substr_count($postContent, '<img');
$last_pos = 0;
for($o=0; $o<$numImages; $o++){
$pos = strpos($postContent,"<img",$last_pos+1);
$postContent = substr_replace($postContent,"<img id='$o' height='50px' onclick='resize(\"$o\")' ",$pos,4);
$last_pos = $pos;
}
echo htmlentities($postContent);
产生此输出:
<div><img id='0' height='50px' onclick='resize("0")' src="http://image1"><img id='1' height='50px' onclick='resize("1")' src="image2"><img id='2' height='50px' onclick='resize("2")' src="image3"></div>
除了通过替换方法修改 HTML,您还可以使用 DOMDocument object
安全地修改它
$postDocument = new DOMDocument();
$postDocument->loadHTML($postContent);
$images = $postDocument->getElementsByTagsName('img');
for($i = 0; $i < $images->length; $i++) {
$element = $images->item($i);
$element->setAttribute('id', $i);
$element->setAttribute('height', '50px');
$element->setAttribute('onclick', 'resize("0")');
}
$postContent = $postDocument->saveHTML();
这样,您就不用担心您选择的img
标签是否定义了属性。
它还可以让您轻松添加新属性。并且它避免了在 html 上使用正则表达式的滑坡,如 answer.
我有一个包含来自表单($postContent)的 html 的字符串。我想为每张图片分配一个唯一的 ID。
我有以下代码:
$numImages=substr_count($postContent, '<img');
for($o=0; $o<$numImages; $o++){
$pos = strpos($postContent,"<img");
$postContent = substr_replace($postContent,"<img id='$o' height='50px' onclick='resize(\"$o\")' ",$pos,4);
}
对于第一次出现的标签,它工作正常,但对于其余的,它不起作用。
进一步说明:
<div><img src="http://image1"><img src="image2"></div>
通过我的代码后,它给出了这个:
<div>
<img id='1' height='50px' onclick='resize("1")' id='0' height='50px'
onclick='resize("0")' src="http://image1"><img src="http://image2"></div>
有人知道问题出在哪里吗?
您对 strpos
的调用总是找到 <img
的第一个实例。您需要使用第三个参数将其偏移前一个 <img
的位置加一。见 manual entry for strpos.
所以这段代码对我有用:
$postContent = '<div><img src="http://image1"><img src="image2"><img src="image3"></div>';
$numImages=substr_count($postContent, '<img');
$last_pos = 0;
for($o=0; $o<$numImages; $o++){
$pos = strpos($postContent,"<img",$last_pos+1);
$postContent = substr_replace($postContent,"<img id='$o' height='50px' onclick='resize(\"$o\")' ",$pos,4);
$last_pos = $pos;
}
echo htmlentities($postContent);
产生此输出:
<div><img id='0' height='50px' onclick='resize("0")' src="http://image1"><img id='1' height='50px' onclick='resize("1")' src="image2"><img id='2' height='50px' onclick='resize("2")' src="image3"></div>
除了通过替换方法修改 HTML,您还可以使用 DOMDocument object
安全地修改它$postDocument = new DOMDocument();
$postDocument->loadHTML($postContent);
$images = $postDocument->getElementsByTagsName('img');
for($i = 0; $i < $images->length; $i++) {
$element = $images->item($i);
$element->setAttribute('id', $i);
$element->setAttribute('height', '50px');
$element->setAttribute('onclick', 'resize("0")');
}
$postContent = $postDocument->saveHTML();
这样,您就不用担心您选择的img
标签是否定义了属性。
它还可以让您轻松添加新属性。并且它避免了在 html 上使用正则表达式的滑坡,如 answer.