用于替换和添加HTML标记的属性的RegEx

时间:2009-03-27 01:17:39

标签: php regex actionscript-3

给出以下代码:

<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属性而另一种是用新的属性填充?

3 个答案:

答案 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