使用正则表达式使用搜索/替换向元素添加新类

时间:2015-10-02 16:34:35

标签: html .net regex

我想在class属性中添加一个NewClass值,并使用一对正则表达式使用find / replace功能修改span的文本。

<div>
   <span class='customer' id='phone$0'>Home</span>
<br/>
   <span class='customer' id='phone$1'>Business</span>
<br/>
   <span class='customer' id='phone$2'>Mobile</span>
</div>

我试图在搜索/替换后使用以下结果:

<span class='customer NewClass' id='phone$1'>Organization</span>

还想知道是否可以对两个任务使用单个查找/替换操作吗?

3 个答案:

答案 0 :(得分:1)

正则表达式可以做到这一点,但请注意,使用正则表达式来更改HTML可能会有许多边缘情况,您可能没有考虑到这些情况。

This regex101 example显示这三个<span>元素已更改为添加NewClass,并且内容将更改为Organization

然而,其他技术会更安全。例如,jQuery可以替换它们,而不管属性的顺序如何:

$("span#phone$1").addClass("NewClass");
$("span#phone$1").text("Organization");

所以要小心,你应该没事。

修改

根据对OP的评论,您只想更改包含ID phone$1的范围,因此regex101链接已更新以反映此情况。

编辑2

固定链接太长而无法放入评论中,因此请在此处添加the permalink。单击底部的“内容”选项卡以查看替换。

答案 1 :(得分:0)

你可以使用这样的正则表达式:

'.*?' id='phone\$1'>.*?<

使用替换字符串:

'customer' id='phone\$1'>Organization<

<强> Working demo

Php代码

$re = "/'.*?' id='phone\\$1'>.*?</"; 
$str = "<div>\n   <span class='customer' id='phone\$0'>Home</span>\n<br/>\n   <span class='customer' id='phone\$1'>Business</span>\n<br/>\n   <span class='customer' id='phone\$2'>Mobile</span>\n</div>"; 
$subst = "'customerNewClass' id='phone\$1'>Organization<"; 

$result = preg_replace($re, $subst, $str);

结果

<div>
   <span class='customer' id='phone$0'>Home</span>
<br/>
   <span class='customerNewClass' id='phone$1'>Organization</span>
<br/>
   <span class='customer' id='phone$2'>Mobile</span>
</div>

答案 2 :(得分:0)

由于您的代码包含preg_matchpreg_replace,我认为您使用的是PHP。

正则表达式通常不是操纵HTML或XML的好主意。请参阅RegEx match open tags except XHTML self-contained tags SO post

在PHP中,您可以将DOMDocument和DOMXPath与//span[@id="phone$1"] xpath一起使用(获取所有span标记id属性vlaue等于phone$1 ):

$html =<<<DATA
<div>
   <span class='customer' id='phone$0'>Home</span>
<br/>
   <span class='customer' id='phone$1'>Business</span>
<br/>
   <span class='customer' id='phone$2'>Mobile</span>
</div>
DATA;
$dom = new DOMDocument('1.0', 'UTF-8');
$dom->loadHTML($html, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);
$xp = new DOMXPath($dom);
$sps = $xp->query('//span[@id="phone$1"]');
foreach ($sps as $sp) {
    $sp->setAttribute('class', $sp->getAttribute('class') . ' NewClass');
    $sp->nodeValue = 'Organization';
}
echo $dom->saveHTML();

请参阅IDEONE demo

结果:

<div>
   <span class="customer" id="phone$0">Home</span>
<br>
   <span class="customer NewClass" id="phone$1">Organization</span>
<br>
   <span class="customer" id="phone$2">Mobile</span>
</div>