preg_replace与通配符?

I have HTML markup bearing the form

<div id='abcd1234A'><p id='wxyz1234A'>Hello</p></div>

which I need to replace to bear the form

<div id='abcd1234AN'><p id='wxyz1234AN'>Hello</p></div>

where N may be 1,2.. .

The best I have been able to do is as follows

function cloneIt($a,$b)
{
 return substr_replace($a,$b,-1);
}

$ndx = "1'";
$str = "<div id='abcd1234A'><p id='wxyz1234A'>Hello</p></div>";
preg_match_all("/id='[a-z]{4}[0-9]{4}A'/",$str,$matches);

$matches = $matches[0];
$reps = array_merge($matches);
$ndxs = array_fill(0,count($reps),$ndx);
$reps = array_map("cloneIt",$reps,$ndxs);

$str = str_replace($matches,$reps,$str);
echo htmlspecialchars($str);

which works just fine. However, my REGEX skills are not much to write home about so I suspect that there is probably a better way to do this. I'd be most obliged to anyone who might be able to suggest a neater/quicker way of accomplishing the same result.

You can optimize your regex like this:

/id='[a-z]{4}\d{4}A'/

Sample code

preg_match_all("/id='[a-z]{4}\\d{4}A'/",$str,$matches);

However an alternative would consist in using en HTML parser. Here I'll use simple html dom:

// Load the HTML from URL or file
$html = file_get_html('http://www.mysite.com/');
// You can also load $html from string: $html = str_get_html($my_string);


// Find div with id attribute
foreach($html->find('div[id]') as $div) {
    if (preg_match("/id='([a-z]{4}\\d{4})A'/" , $div->id, $matches)) {
       $div->id = $matches[1] + $ndx;
    } 
}

echo $html->save();

Did you notice how elegant, concise and clear the code becomes with an html parser ?

References