我的任务是以编程方式将HTML主模板拆分为子模板,对每个模板执行一些小修改,并保存生成的文件。
为什么我使用Bash (你可以跳过这个来解决问题)
(已编辑)使用Bash的选择相当随意。我知道它运行Red Hat 5.5,所以我写了一个Bash脚本。它确实有一个PHP解释器,但我决定不使用PHP,因为同一台服务器将托管使用PHP的网站,可能会看到很多流量,所以我害怕绑定一个FastCGI每小时执行此操作的套接字(我不控制脚本执行的频率,只是执行的内容)。我也可以安装我想要的任何解释器(我实际上已经知道的脚本语言:Perl,Python,PHP,也许是Lua)。然而,这是一个不同的问题。这个问题假设我想使用Bash脚本。
问题
我有一个主模板文件,类似于:
<!DOCTYPE html PUBLIC .... >
<html lang="en" ...>
<head> ... </head>
<body>
<div id=...></div>
<div id=...></div>
</body>
</html>
由此,我需要从文档顶部解析到</head>
,从该部分中删除几行并添加一行,将<title>
占位符替换为实际标题,并且将其保存到文件中。然后我需要将<body>
和第一个<div>
解析为单独的文件,然后最后解析第二个<div>
(我还需要在页脚中对其进行一些更改)。我将丢弃</body>
和</html>
,因为此模板实际上是两层模板的一部分(替换的页面标题将使用Smarty变量来获取其文本)。
难题
问题是,有没有比正则表达更容易/更好的方法呢?我知道Bash提供了复合命令[[ htmlstring =~ "/regex/" ]]
和${BASH_REMATCH}
来匹配或替换,但我也知道用正则表达式解析HTML通常是a bad idea。
答案 0 :(得分:2)
如果要解析的HTML文件具有已知的固定结构,则可以使用awk
。编写一个将状态保存在变量中的程序(例如,等待标题,解析标题,等待正文)并在读取文件时执行不同的操作并不是很困难。它还支持正则表达式,您可以将所有内容放入结构良好的文件中。
答案 1 :(得分:1)
您可以使用命令-H
提供的xmlstarlet
(HTML)选项来操作HTML文件。
例如:
# content of template file
$ cat template.html
<!DOCTYPE html >
<html lang="en">
<head> ... </head>
<body>
<div id="div1"></div>
<div id="div2"></div>
</body>
</html>
# update the head tag
$ xmlstarlet ed -H -u '//head' -v 'hello, world' template.html
<?xml version="1.0"?>
<!DOCTYPE html>
<html lang="en">
<head>hello, world</head>
<body>
<div id="div1"/>
<div id="div2"/>
</body>
</html>
答案 2 :(得分:0)
好的,所以我要使用PHP,我将使用标准的字符串操作。我应该能够很好地利用explode
来做这类事情。谢谢大家。