我有几千个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"
提前致谢。
答案 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]"/>