给出以下代码:
<body>
<img src="source.jpg" />
<p>
<img src="source.jpg" id ="hello" alt="nothing" />
<img src="source.jpg" id ="world"/>
</p>
</body>
最好的方法是什么 - 使用正则表达式(或更好?) - 替换它以便它成为:
<body>
<img src="source.jpg" id="img_0" />
<p>
<img src="source.jpg" id ="img_1" alt="nothing" />
<img src="source.jpg" id ="img_2"/>
</p>
</body>
换句话说:
所有<image />
代码都会被id
属性填充。
id
属性应该包含一个递增的属性(这不是问题,尽管它只是替换过程的一部分)
我想我需要两次传递,一次是删除所有现有的id
属性而另一种是用新的属性填充?
答案 0 :(得分:5)
<?php
$data = <<<DATA
<body>
<img src="source.jpg" />
<p>
<img src="source.jpg" id ="hello" alt="nothing" />
<img src="source.jpg" id ="world"/>
</p>
</body>
DATA;
$doc = new DOMDocument('1.0', 'UTF-8');
$doc->strictErrorChecking = true;
$doc->standalone = true;
$doc->xmlStandalone = true;
$doc->formatOutput = true;
$doc->loadXML($data, LIBXML_NOWARNING | LIBXML_NOERROR);
$sNode = $doc->getElementsByTagName("img");
$id = 0;
foreach($sNode as $searchNode)
{
$searchNode->setAttribute('id', "img_$id");
$doc->importNode($searchNode);
$id++;
}
$result = $doc->saveHTML();
echo $result;
答案 1 :(得分:2)
我认为最好的方法是使用preg_replace_callback
。
另外,我建议比目前建议的regexp
稍微严格一些{如果您的网页包含{em> 包含<img />
的{{1}}标记,该怎么办?属性?
id
为我产生以下内容:
$page = '
<body>
<img src="source.jpg" />
<p>
<img src="source.jpg" id ="hello" alt="nothing" />
<img src="source.jpg" id ="world"/>
</p>
</body>';
function my_callback($matches)
{
static $i = 0;
return $matches[1]."img_".$i++;
}
print preg_replace_callback('/(<img[^>]*id\s*=\s*")([^"]*)/', "my_callback", $page);
<body>
<img src="source.jpg" />
<p>
<img src="source.jpg" id ="img_0" alt="nothing" />
<img src="source.jpg" id ="img_1"/>
</p>
</body>
有两个捕获组,第一个是我们保留的,第二个是我们替换的。我使用了很多负面字符类(例如regexp
=最后关闭[^>]*
)以确保>
标记不需要 { {1}}属性。
答案 2 :(得分:1)
通过适当的转义(我永远不会记得没有试验和错误),以及增加img_number的东西,你想要替换这样的东西:
(&lt; img。*?)(?:id =“。*”)?(。*?/&gt;)
有这样的事情:
\ 1 id =“img_ $ i”\ 2