JavaScriptのreplaceで青空文庫のルビを削除する方法

このQ&Aのポイント
  • JavaScriptのreplaceメソッドを使用して、青空文庫のルビを削除する方法をご紹介します。
  • 以下のコードを使用することで、ルビを含む文字列からルビを削除することができます。
  • ただし、現在のコードでは正しく動作していないようです。正しいルビ削除の方法について、以下に示します。
回答を見る
  • ベストアンサー

javascriptのreplaceについて

javascriptを使って青空文庫のルビを削除したいと考えています。 例えば以下のような文章です。 「みんながうまそうに食べている<ruby><rb>最中</rb><rp>(</rp><rt>さなか</rt><rp>)</rp></ruby>に、こんな話は禁物だ。… これを 「みんながうまそうに食べている最中に、こんな話は禁物だ。… というようにしたいと思っています。 そこで、以下のようなコードを書いたのですが、どうもうまく動いてくれません。 ----------------------------------------------------------------------- doc = temp.replace(/<ruby><rb>(.+)<\/rb><rp>.+<\/rp><rt>.+<\/rt><rp>.+<\/rp><\/ruby>/gi, "$1"); 処理結果: 「みんながうまそうに食べている最中</rb><rp>(</rp><rt>さなか</rt><rp>)</rp></ruby>に、こんな話は禁物だ。… ----------------------------------------------------------------------- どこが誤っているのでしょうか? ご指導お願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • duron
  • ベストアンサー率77% (73/94)
回答No.1

正規表現で「.+」とすると任意の文字1文字以上となりますので(.+)に該当するのは 「最中・・・」から最後に出現するルビの部分になってしまいます。 「.+?」とすれば最小の文字列でマッチングする部分、となりますので doc = temp.replace(/<ruby><rb>(.+?)<\/rb><rp>.+?<\/rp><rt>.+?<\/rt><rp>.+?<\/rp><\/ruby>/gi, "$1"); とすればうまくいくのではないかと思います。 おいしい最中(もなか)が食べたくなってきました・・・。

audrey1800
質問者

お礼

試してみたところ無事動きました。 ありがとうございました。 最中は好きです。

その他の回答 (4)

  • think49
  • ベストアンサー率59% (285/482)
回答No.5

#2, 4 です。 https://gist.github.com/743362 を更新して function removeTagsAll を入れ子のタグにも対応してみました。 "<ruby><ruby>hogehoge</ruby></ruby>" のようなタグの対応関係を認識して "hogehoge" に置換してくれます。(ruby要素は入れ子にならない仕様のようですが、念のため) 関数名が「removeAllNodes → removeNodesAll」「removeAllTags → removeTagsAll」に変更されているので、#2, 4 のコードを利用する場合は適宜修正してください。 元々のフォーマットが XHTML に準拠しているならDOM操作。 そうでないなら、正規表現で置換するという選択肢もありかなと思います。

  • think49
  • ベストアンサー率59% (285/482)
回答No.4

#2 です。 以下、正規表現で実装するケースです。(#2 と考え方は同じ) https://gist.github.com/743362 を取り込んで、 --- (function () {  function AozoraBunko (string) {   this.string = string + '';   return this;  }  AozoraBunko.prototype.removeAllTags = function (tagName /*, deep*/) {   this.string = removeAllTags (this.string, tagName, arguments[1]);   return this;  }  var aozoraString, aozora;  aozoraString = [   'みんながうまそうに食べている\u003Cruby\u003E\u003Crb\u003E最中\u003C/rb\u003E\u003Crp\u003E(\u003C/rp\u003E\u003Crt\u003Eさなか\u003C/rt\u003E\u003Crp\u003E)\u003C/rp\u003E\u003C/ruby\u003Eに、こんな話は禁物だ。',   'みんながうまそうに食べている\u003Cruby\u003E\u003Crb\u003E最中\u003C/rb\u003E\u003Crt\u003Eさなか\u003C/rt\u003E\u003C/ruby\u003Eに、こんな話は禁物だ。'  ].join('\r\n');  aozora = new AozoraBunko(aozoraString).removeAllTags('rt', true).removeAllTags('rp', true).removeAllTags('rb', false).removeAllTags('ruby', false);  alert([aozoraString, aozora.string].join('\r\n\u3000\u2193\r\n')); })(); --- # 全角空白は半角空白に置換してください。

回答No.3

ExtendScript Toolkit上では動きました <が処理の段階ではエスケープされてて &ltになってるとかじゃないでしょうか でも#1の方のいわれてるように 最小一致にはしておいたほうがいいかと思います

audrey1800
質問者

お礼

エスケープが原因ではなかったみたいです。 ありがとうございました。

  • think49
  • ベストアンサー率59% (285/482)
回答No.2

おそらく質問文中と同じ論理構造とは限らないのですよね…。 もう少し簡単に考えてみてはどうでしょうか。 ・rt要素, rp要素を子要素を含めて削除する ・ruby要素, rb要素を子要素を残して削除する (※以下、全角空白は半角空白に置換してください) --- <p>みんながうまそうに食べている<ruby><rb>最中</rb><rp>(</rp><rt>さなか</rt><rp>)</rp></ruby>に、こんな話は禁物だ。</p> <p>みんながうまそうに食べている<ruby><rb>最中</rb><rt>さなか</rt></ruby>に、こんな話は禁物だ。</p> <script type="text/javascript"><!-- (function () {  function removeAllNodes (nodeList, deep) {   var targetNode, parentNode, doc, df, childNodes, i, l, j;   if (!nodeList) {    return;   }   if (deep) {    for (i = nodeList.length - 1; i > -1; i -= 1) {     targetNode = nodeList[i];     targetNode.parentNode.removeChild(targetNode);    }   } else {    df = nodeList[0].ownerDocument.createDocumentFragment();    for (i = nodeList.length - 1; i > -1; i -= 1) {     targetNode = nodeList[i];     parentNode = targetNode.parentNode;     childNodes = targetNode.childNodes;     j = childNodes.length - 1;     if (j > -1) {      for (;j > -1; j -= 1) {       df.appendChild(childNodes[j]);      }      parentNode.replaceChild(df, targetNode);     }    }   }  }  var doc = document;  removeAllNodes(doc.getElementsByTagName('rt'), true);  removeAllNodes(doc.getElementsByTagName('rp'), true);  removeAllNodes(doc.getElementsByTagName('rb'), false);  removeAllNodes(doc.getElementsByTagName('ruby'), false); })(); //--></script> ---

audrey1800
質問者

お礼

勉強になりました。 ありがとうございました。

関連するQ&A

  • テキストファイル(《》←をふりがな表記使用/青空文庫形式)をhtml化したい

    趣味で文章を書いている者です。 執筆は秀丸エディタで、ルビは「|振り仮名《ふりがな》」のように 表記しています。 smoopyなどの専用ビューアでは、ちゃんと認識してくれるので、 自分で読む分には不便はないのですが…… しかし、HPに載せる場合には、<ruby><rb>振り仮名</rb><rp>(</rp><rt>ふりがな</rt><rp>)</rp></ruby>としなければなりません。とても面倒です。 この青空文庫形式のルビを、htmlに変換するマクロなどはありませんでしょうか? ~ここからは複数の手順を踏んでも構わないやり方~ 青空文庫形式をwordに変換するマクロはありましたが、wordのhtml化はやたらとファイルが重く、不格好になってしまうのでちょっと……。 なお、青空文庫→Word→一太郎→HTML化という手順も踏みましたが、 この場合だと、振り仮名(ふりがな)とカッコ表記になってしまいます。 http://ameblo.jp/lm064574/entry-10020015211.html こちらのサイトさんの、一太郎のルビを<ruby>タグ化するマクロも試しましたが、最初の方の文字以外、極小サイズになってしまう不具合が発生してしまいました……。 ご存じの方、いらっしゃいましたらご教授お願い致します。

  • ルビ対応ブラウザと非対応ブラウザのルビのサイズ

    HTMLで<ruby>タグ等を使って読み仮名を振ることはできるのですが そのルビの文字サイズを思ったとおりに変えることができません 知りたい事は、ルビに対応しているブラウザで文字サイズを大きくして 非対応のブラウザでは文字サイズは変わらないようにする方法です <ruby><rb>田中</rb><rp>(</rp><rt>たなか</rt><rp>)</rp></ruby>とすると ルビに対応しているブラウザは“田中”の上に小さく“たなか” 非対応のブラウザだと田中(たなか)という感じになりますよね そこでルビ対応ブラウザのルビのサイズをちょうど良いくらいに変更すると 当たり前のことですが非対応のブラウザの文字サイズまで変わってしまいます それをなんとかしようと、自分のわかる範囲で いろいろと試してみたのですがうまくいきません 複雑であっても良いので、ルビに対応したブラウザだけ ルビの文字サイズを変える方法があったら教えてください

  • アンケートフォームの修正(ラジオボタンからチェックボックスにHTMLを書き換えると誤動作します)

    初めてホームページを作成しているものです。 ホームページビルダー11を使っています。 アンケートフォームを作成したのですが、間違いに気付き、 ラジオボタンからチェックボックスへ、HTMLを書き換えて修正しました。 見た目はうまくいったのですが、試しにアンケートに入力して送信しようとすると、この設問に対して、「Q17は必須設問です」のようなメッセージが出ます。 必須設問には違いないのですが、ちゃんとチェックボックスをチェックしているのに、このメッセージがでるのは、おかしいと思います。 どなたか、ちぇっくしていただけないでしょうか? ちなみに、日英併記、日本語にはルビを打っているので、読みにくくなっています。 よろしくお願いいたします!! <H3 id="Q17_head">Q 17.</H3> <BLOCKQUOTE> <P>Prefecture to Teach(Public Data)<BR> <RUBY><RB>教</RB><RP>(</RP><RT>おし</RT><RP>)</RP></RUBY>える<RUBY><RB>都道府県</RB><RP>(</RP><RT>とどうふけん</RT><RP>)</RP></RUBY>(<RUBY><RB>公開項目</RB><RP>(</RP><RT>こうかいこうもく</RT><RP>)</RP></RUBY>)</P> <TABLE> <TBODY> <TR> <TD><INPUT type="checkbox" name="Q17_1"></TD> <TD id="Q17_1_ca"></TD> <TD>Hokkaido <RUBY><RB>北海道</RB><RP>(</RP><RT>ほっかいどう</RT><RP>)</RP></RUBY></TD> </TR> <TR> <TD><INPUT type="checkbox" name="Q17_2"></TD> <TD id="Q17_2_ca"></TD> <TD>Aomori <RUBY><RB>青森県</RB><RP>(</RP><RT>あおもりけん</RT><RP>)</RP></RUBY></TD> </TR> (省略) </TBODY> </TABLE> </BLOCKQUOTE> 以上

  • ルビ行と同じ行間にそろえたい

    <RUBY>鋭心<RP>(</RP><RT>とごころ</RT><RP>)</RP></RUBY> というようにしてルビを振ることがわかりましたが、ルビのある行はない行より行間が広くなります。ルビのない行もルビのある行と同じ行間にしたいのですが、そんなことはできないでしょうか。

  • xsltを利用して変換後改行が入る

    MSXMLを利用して、XMLをHTMLへ変換しているのですが、変換後、改行が入ってしまいます。 どうすれば改行を取ることができるでしょうか? 【xslt】 <xsl:template match="ruby"><xsl:copy-of select="self::node()" /></xsl:template> 【XML】 <ruby><rb>○</rb><rp>〔</rp><rt>××</rt><rp>〕</rp></ruby> 【結果(HTML)】 <ruby xmlns=""> <rb>○</rb> <rp>〔</rp> <rt>××</rt> <rp>〕</rp>

    • 締切済み
    • XML
  • HPビルダー2001にて……

    現在HPビルダー2001をwin2000上で使用しているのですが、不具合を見つけたので質問させて頂きます。 <ruby><rb>単語<rp><rt>ルビ<rb><ruby> 上記のようにタグを使ってルビを振ってみたところ、プレビュー画面で画面端での文章の折り返しがされていませんでした。 上記のやり方でルビを振った文章を消去してみたところ、折り返しは正常に表示されたので、原因はここにあると思います。 タグの打ち間違いなのか……? そこで質問なのですが、折り返しを正常にしたままタグでルビを振るにはどうしたらよいのでしょうか? アドバイスお願いします。

  • FirefoxとIEの両方でルビをふる方法はありますか?

    HTMLで、 <ruby>太郎<rp>(</rp><rt>たろう</rt><rp>)</rp></ruby> と書くと、IEで見たときには、「太郎」の上に「たろう」とルビがふられますが、Firefox等で見ると、「太郎(たろう)」と表示されてしまいます。 Firefoxでも、アドオンで、 https://addons.mozilla.org/ja/firefox/addon/1935 をインストールすれば、ルビが見られますが、 その場合は、上記アドオンを追加したパソコンでしかルビは見られません。 IEとFirefoxの両方でルビをふる良い方法はないものでしょうか?

  • HPビルダーでのルビ振りで不具合が出ます。

    HPビルダー2001にて製作したネット小説を公開しているのですが、タグを使ってルビを振る際に、ルビ自体は正常に表示されるのですが、右端での折り返しが無効化され、文章が横に伸びてしまうという不具合が出てしまいます。 ビルダー上の「標準」では正常に折り返されているのですが、「プレビュー」及びアップロード後のブラウザ上では折り返しが無効化されていました。 閲覧の際に使用したブラウザはIE8です。 ルビ振り用のタグを削除すると正常に折り返されるので、原因はタグにあると思うのですが……。 ルビを振る際のタグは「<ruby><rb>単語<rp><rt>読み方<rb><ruby>」という形で入力しています。 どうすれば折り返しを保ったままルビが振れるのでしょうか? 以下にルビを振った箇所のHTMLソースを切り取って掲載しておきますので参考にして下さい。 アドバイス、よろしくお願いします。 人工身体装着者に義務付けられている定期心理検査。一ヶ月のうち最も憂鬱な時間を終えて廊下に出たヘイウッドは、通い慣れた窓口に向かう。受付にはいつもの没個性的な制服の職員。<BR>  カウンターにIDカードを放る。職員は無感情な動作でそれを受け取り、ヘイウッドの市民IDを確認。同じく無感情な声で「データを」<BR>  ヘイウッドは着古したコートのポケットを探り、支給品の個人用端末をデスクの上に置く。<BR>  端末を読み込む職員。モニターに捕殺対象となっていた2体のアンドロイドのデータ。<ruby><rb>処理・2体<rp><rt>ツーキル<rb><ruby>。<BR> 「確認終わりました。捕殺対象No,148687、ネクサス6型及びNo,145968、ネクサス7型の処理を確認。<ruby><rb>賞金<rp><rt>ポイント<rb><ruby>をIDカードに入力します」<BR>  IDカードを受け取る。貨幣経済はもはや研究者のデータベースの中にしか存在しない。金銭はいまや実体を失い、チップを埋め込まれたプラスチックのカードに入力された数値データとなっている。<BR>  これで当面の生活費には困らない。そろそろ<ruby><rb>闇市<rp><rt>マーケット<rb><ruby>が開く頃だ。<BR>  安価な軍の流出品が残っているうちに必要なものを買い込んでおかなければならない。<BR>  建物の入り口のあたりで、フランクが声をかけてきた。同業者の一人だ。<BR>

  • 正規表現で

    正規表現で $ruby = "昨日の天気(てんき)は雨だったが、今日は快晴(かいせい)だ。明日の天気は曇りの可能\性(かのうせい)が高い"; $ruby =~ s/([亜-煕]|[一-龠])(([^)]*))/<ruby><rb>$1<\/rb><rp>(<\/rp><rt>$2<\/rt><rp>)<\/rp><\/ruby>/g; としたら実行結果がこうなりました。 昨日の天気(てんき)は雨だったが、今日は快・ruby>ー(かいせい)だ。明日の天気は曇りの可能・ruby>ォ(かのうせい)が高い どうすればよろしいですか?

    • ベストアンサー
    • Perl
  • 外部ファイルに「漢字(かんじ)、片仮名(かたかな)、平仮名(ひらがな)

    外部ファイルに「漢字(かんじ)、片仮名(かたかな)、平仮名(ひらがな)、アルファベット」と書かれていたとします。これをperlのopen(IN,">ファイル名");で読み込んでファイルの中身を$_に代入する時に、漢字(かんじ)や平仮名(ひらがな)などの漢字と括弧で囲まれた平仮名の文字列にマッチしたらルビタグを挿入したいのですが、どうすればいいですか? 「漢字(かんじ)」や「平仮名(ひらがな)」を「<ruby><rb>漢字</rb><rp>(</rp><rt>かんじ</rt><rp>)</rp></ruby>」のような文字列に置換したいのです。

    • ベストアンサー
    • Perl

専門家に質問してみよう