- 締切済み
Perl 特定のタグ内を置換しない
恐れ入ります。特定のhtmlタグ具体的には<h3></h3>タグないの文字列だけを除いて置換を掛けたいのですがなかなかうまくいきません。 $temp = s/[^<h3>(.+?)<\/h3>]$mojiretu1/<a href="$mojiretu2">リンク先</a>/; とした場合、<h3>タグ内の置換はされないようですが、置換後のリンク先の先頭部分が文字化けを起こしてしまいます。原因が分かる方いらっしゃいましたらご教授いただけたら助かります。 よろしくお願いいたします。
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- Ultra-Hetare
- ベストアンサー率38% (204/526)
はずしているかも知れませんが、 $temp = s/(<[^h][^3]>).+(<[^/][^h][^3]>)/$1<a href="$mojiretu">リンク先</a>$2; のように思いました。 以上です。
- asciiz
- ベストアンサー率70% (6803/9674)
><h3></h3>内の富士山を除き置換する感じです。 >「今日の」と「は奇麗だ」は文章によって変更されますので、 >指定することができません。 まあ実際、ネスト構造を持つタグを、単純な文字列検索である正規表現でマッチするのはかなり難しいものがあります…。 例えば、「該当する部分を、置換しない」ということを実現するためには、マッチした部分文字列を再利用します。 正規表現において丸カッコでくくった部分は、置換部分で順に $1 $2 $3 …として使用できます。 s/(あああ)いいい/$1ううう/ こうすると、「"あああ"に続いている"いいい"だけ、"ううう"に置換する」ということができます。 「あああいいい」→「あああううう」 「かかかいいい」→「かかかいいい」※マッチせず置換も起こらない ご質問に応用すると、 s/(<h3>[^<>]*<\/h3>[^<>]*)富士山/$1御嶽山/g; こんな書き方をすると、<h3>の後ろにある富士山だけを置換できます。 ただこれは逆に、<h3>タグが無ければマッチしません。 また<h3>タグからマッチ文字列の間に何らかのタグが挟まってもいけません。([^<>]* でタグ開始・終了文字を排除しているため) そこで逆に、「否定先読み」を使ってみます。 s/(?!<\/h3>)([^<>]*)富士山([^<>]*)(?!<h3>)/$2御嶽山$3/g; これでたぶん、 「</h3>を含まず、"富士山"の前の文字列と、"富士山"の後の文字列をマッチさせ、<h3>を含まない部分」 を 「文字列"御嶽山"文字列」 に置換する、になりそうに思うんですけども。 どうですかね…。
補足
有難うございます。やってみましたが、うまくいきませんでした。ToT)これはできないことなんですかね・・。
- asciiz
- ベストアンサー率70% (6803/9674)
> [^<h3>(.+?)<\/h3>] この部分は変ですよ。 文字セットを作成する角カッコ [ ] は、あくまでも文字単位でしか働きません。 その様に書いたところで、『「<h3>~</h3>」を除く』という意味にはならないのです。 その正規表現がどう解釈されるかというと、[ ] に含まれている文字群の否定(^)となりますから、 『「<」・「>」・「(」・「)」・「.」・「+」・「?」・「\」・「/」・「h」・「3」の、いずれにも該当しない1文字』 という意味になります。 これは、あなたの欲しているものではないでしょう。 ---- 『文字列の否定』を表す「(?!文字列)」という正規表現があるのですが、この正規表現が少々新しく、使えない言語やバージョンが存在します。 使えるのであれば、以下のページなど参考になるかもしれません。 ※後半の「否定先読み」「否定戻り読み」の項 >正規表現:文字列を「含まない」否定の表現まとめ | WWWクリエイターズ >https://www-creators.com/archives/1827
補足
ご回答有難うございます。読んでみたのですが、今一つ理解ができませんでした。否定先読みについて他サイトでも調べてみましたが、直前一致か直後一致のようの書かれていたり、置換処理のなかでどのように使えばよいのかまでたどり着けませんでした。この方法を使って<h3></h3>内を除く置換処理はどのように記述したらよろしいでしょうか。 <h3>今日の富士山は奇麗だ</h3> 今日の富士山は奇麗だ。 これを、<h3></h3>内の富士山を除き置換する感じです。「今日の」と「は奇麗だ」は文章によって変更されますので、指定することができません。 よろしくお願いします。
補足
有難うございます。うまくいきませんでした。<h3></h3>内の$mojiretu1を$mojiretu2に置換するイメージです。これはできないことなんですかね・・。