preg_replace与通配符?

时间:2014-02-04 09:30:35

标签: php regex

我有带有

形式的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技能并不多,所以我怀疑可能有更好的方法来做到这一点。对于任何能够建议更简洁/更快速地完成相同结果的人,我都是最有责任的。

1 个答案:

答案 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解析器一起使用?

参考