我有带有
形式的HTML标记< div id ='abcd1234A'>< p id ='wxyz1234A'> Hello< / p>< / div>
我需要替换以承担表格
< div id ='abcd1234AN'>< p id ='wxyz1234AN'> Hello< / p>< / div>
其中N可以是1,2 ..。
我能做的最好的事情如下
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);
效果很好。但是,我的REGEX技能并不多,所以我怀疑可能有更好的方法来做到这一点。对于任何能够建议更简洁/更快速地完成相同结果的人,我都是最有责任的。
答案 0 :(得分:1)
您可以像这样优化正则表达式:
/id='[a-z]{4}\d{4}A'/
preg_match_all("/id='[a-z]{4}\\d{4}A'/",$str,$matches);
然而,替代方案将包括使用en HTML解析器。在这里,我将使用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();
您是否注意到优雅,简洁以及清除代码如何与 html解析器一起使用?