PHP只替换一次

时间:2015-08-19 16:31:59

标签: php replace strpos

我有一个包含来自表单的html的字符串($ postContent)。我想为每张图片分配一个唯一的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>

任何人都知道问题可能是什么?

2 个答案:

答案 0 :(得分:1)

您对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>

答案 1 :(得分:1)

您可以使用DOMDocument object

安全地修改HTML,而不是通过替换方法修改HTML
$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中所示。