正则表达式:将HTML属性值更改为某种模式

时间:2010-05-15 15:46:31

标签: html regex netbeans

我有几千个html标签,写得像这样:
<input type="text" name="CustomerName" />
<input type="text" name="SalesOrder"/>

我需要匹配每个name属性值并将它们全部转换为如下:
CustomerName -> cust[customer_name]
SalesOrder -> cust[sales_order]

结果将是:
<input type="text" name="cust[customer_name]" />
<input type="text" name="cust[sales_order]" />

我最好的尝试都坚持这种模式: name=\"[a-zA-Z0-9]*\"
- &gt;刚刚找到name="CustomerName"

提前致谢。

2 个答案:

答案 0 :(得分:2)

解析HTML并不能很好地利用RegEx。请参阅here

话虽如此,这可能是一个足够小的任务,它不会让你疯狂。 你需要这样的东西:

查找:name="(.+)"

替换:name="cust[$1]"

然后希望你的HTML不是非常不规则(大多数是,但你总能希望)。

更新:这里有一些sed-fu让你开始使用camelCase - &gt;下划线。

答案 1 :(得分:0)

这样的东西?

<?php
$subject = <<<EOT
<input type="text" name="CustomerName" />
<input type="text" name="SalesOrder"/>
EOT;
$pattern = '/\\bname=["\']([A-Za-z0-9]+)["\']/';
$output = preg_replace_callback($pattern, function ($match) {
    return ''
    . 'name="cust['
    . strtolower(preg_replace('/(?<=[a-z])([A-Z])/', '_$1', $match[1]))
    . ']"';
}, $subject);
?>
<pre><?php echo htmlentities($output);?></pre>

输出如下:

<input type="text" name="cust[customer_name]" />
<input type="text" name="cust[sales_order]"/>