2012-02-23 10 views
1

HTMLマスターテンプレートをサブテンプレートに分割し、各テンプレートを少し修正し、結果ファイルを保存することを任されました。正規表現なしのBashスクリプトでHTML文書を解析する

私はバッシュを使用しているのはなぜ(あなたが質問に取得するには、これを省略することができます)(編集済み)

バッシュを使用するための選択肢はかなり任意です。私はそれが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>までの文書の先頭から解析する必要があり、ストリップそのセクションからいくつかの行を追加して1つを追加し、実際のタイトルで<title>プレースホルダーを置き換え、ファイルに保存します。その後、<body>と最初に<div>を別々のファイルとして解析し、最後に2番目の<div>(これにはページフッターにいくつかの変更を加える必要があります)を解析する必要があります。 </body></html>は、このテンプレートが実際には2層のテンプレートの一部であるため、破棄されます(置き換えられたページタイトルはSmarty変数を使用してテキストを取得します)。

難問

質問があり、正規表現よりも、これを行うには簡単に/より良い方法はありますか?私はBashがコンパイルコマンド[[ htmlstring =~ "/regex/" ]]${BASH_REMATCH}をマッチしたり置換したりするのを知っていますが、HTMLを正規表現で解析することは一般的にa bad ideaです。

+2

ターゲットサーバにPerlがすでにインストールされているかどうかを再確認します。おそらく(特にPHPも既に存在する場合)、あなたのコードはPerlで簡単に実行できるようになります。また、Webサーバーを経由せずにシェルスクリプトとしてPHPスクリプトを実行することもできます。 –

+0

私はPerlでは非常に効率的ではありませんが(1つまたは2つのスクリプトしか書かれていません)、この場合は 'WWW :: Mechanize'を使用すると思いますか? – darvids0n

+1

いいえ、あなたの説明からは、テキスト(マスターテンプレートファイル)を処理していて、さらにいくつかのテキスト(テンプレートファイルを変更)を生成しているようです。 'WWW :: Mechanize'を使う必要はありません。 –

答えて

2

解析しているHTMLファイルが既知の固定構造を持っている場合は、awkを使用できます。変数に状態を保持するプログラム(例えば、ヘッダを待つこと、ヘッダを解析すること、ボディを待つことなど)を書くことは、それほど難しくありません。また、正規表現もサポートしており、すべてを構造化されたファイルにまとめることができます。

+0

これはちょっと参考になりますが、私の考えるラインカウントを吹き飛ばすでしょう。特に懸念されるのは、私がまだ正規表現を使用しているということです。私の質問は正規表現よりも良い方法があるかどうかでした。あなたは「いいえ、awkを使って正規表現をやって」と言っているようです。 – darvids0n

+1

確かに正規表現を使用していますが、パーサーを使用しない場合は、正規表現が次の「最良のもの」です。とにかくこの答えを追加したのは、このケースのためにawkにスクリプトを書くのは普通のbashよりも簡単だと思うからです。 –

1

コマンドxmlstarletによって提供される-H(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> 
+0

XPathを使用していますか?また、私は思っていないサーバー上に 'xmlstarlet'を持っていません。標準のRHELパッケージのようには聞こえません。 – darvids0n

0

わかりましたので、私はPHPでつもりだと私は標準の文字列操作を使用します。この種のことをするには、explodeをうまく利用できるはずです。皆さんありがとう。

関連する問題