« MicrosoftキーボードのMac用ドライバーに不具合 | トップページ | Mac OS X (Snow Leopard) における非アクティブウィンドウ操作のまとめ »

2010年10月 8日 (金)

正規表現でHTMLタグをマッチさせる

Perl スクリプトで HTML ファイルからとある Javascript 部分を除去しようと思い、<script></script> の間に hogehoge という文字列が含まれていることに着目して

/<script [¥w¥W]+?hogehoge[¥w¥W]+?<¥/script>/

というような正規表現を記述して実行してみたところ、見事に失敗した。

原因は、hogehoge を含む<script>タグの前に、hogehogeを含まない<script>タグがあったことである。具体的に言うと

<html>
<head>
   <script>※1
   nanigashi
   </script>
</head>
<body>
iroiro
   <script>※2
   hogehoge
   </script>※3
</body>
</html>

という HTML に上記の正規表現を適用したのだが、※2から※3をマッチさせるつもりが、※1から※3までマッチしてしまったのである。

そこで、ウェブ上の情報を頼りに試行錯誤してみたところ、

/<script ((?!<script)[¥w¥W])+?hogehoge[¥w¥W]+?<¥/script>/

のように書けばよいことがわかった。((?!<script)[¥w¥W])の部分が「<scriptという文字列を含まない任意の1文字(改行を含む)」を表す。こうすれば、確実に「あるタグではさんだ部分だけ」をマッチさせることができる。

なお、改行を含まない場合は ((?!<script).) となる。

« MicrosoftキーボードのMac用ドライバーに不具合 | トップページ | Mac OS X (Snow Leopard) における非アクティブウィンドウ操作のまとめ »