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>に、こんな話は禁物だ。…
-----------------------------------------------------------------------
どこが誤っているのでしょうか?
ご指導お願いします。
No.1ベストアンサー
- 回答日時:
正規表現で「.+」とすると任意の文字1文字以上となりますので(.+)に該当するのは
「最中・・・」から最後に出現するルビの部分になってしまいます。
「.+?」とすれば最小の文字列でマッチングする部分、となりますので
doc = temp.replace(/<ruby><rb>(.+?)<\/rb><rp>.+?<\/rp><rt>.+?<\/rt><rp>.+?<\/rp><\/ruby>/gi, "$1");
とすればうまくいくのではないかと思います。
おいしい最中(もなか)が食べたくなってきました・・・。
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操作。
そうでないなら、正規表現で置換するという選択肢もありかなと思います。
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.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>
---
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・あなたの人生で一番ピンチに陥った瞬間は?
- ・初めて見た映画を教えてください!
- ・今の日本に期待することはなんですか?
- ・【大喜利】【投稿~1/31】『寿司』がテーマの本のタイトル
- ・集中するためにやっていること
- ・テレビやラジオに出たことがある人、いますか?
- ・【お題】斜め上を行くスキー場にありがちなこと
- ・人生でいちばんスベッた瞬間
- ・コーピングについて教えてください
- ・あなたの「プチ贅沢」はなんですか?
- ・コンビニでおにぎりを買うときのスタメンはどの具?
- ・おすすめの美術館・博物館、教えてください!
- ・【お題】大変な警告
- ・【大喜利】【投稿~1/20】 追い込まれた犯人が咄嗟に言った一言とは?
- ・洋服何着持ってますか?
- ・みんなの【マイ・ベスト積読2024】を教えてください。
- ・「これいらなくない?」という慣習、教えてください
- ・今から楽しみな予定はありますか?
- ・AIツールの活用方法を教えて
- ・最強の防寒、あったか術を教えてください!
- ・【大喜利】【投稿~1/9】 忍者がやってるYouTubeが炎上してしまった理由
- ・歳とったな〜〜と思ったことは?
- ・モテ期を経験した方いらっしゃいますか?
- ・好きな人を振り向かせるためにしたこと
- ・スマホに会話を聞かれているな!?と思ったことありますか?
- ・それもChatGPT!?と驚いた使用方法を教えてください
- ・見学に行くとしたら【天国】と【地獄】どっち?
- ・これまでで一番「情けなかったとき」はいつですか?
- ・この人頭いいなと思ったエピソード
- ・あなたの「必」の書き順を教えてください
- ・14歳の自分に衝撃の事実を告げてください
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
functionから別のfunctionを実...
-
idを使わずにonclickで自身の要...
-
jQueryが読み込めない
-
要素名がスペースを含む場合のj...
-
javascript(jQuery)でセル内...
-
jQuery 同じ処理を関数にまとめ...
-
JavaScript/jQuery で元画像フ...
-
クリックすると上に開くアコー...
-
XMLHttpRequestオブジェクトが...
-
LightBoxで
-
XMLHttpRequestでキャッシュを...
-
ムービークリップを消したいの...
-
Matlabで自作関数をオーバーロード
-
google apps scriptの終了のさせ方
-
同じIDで定義した要素の配列を...
-
C#で、ContextMenuStripに動的...
-
confirmの連続?
-
jspからjavascriptの変数引継ぎ
-
ActiveXobjectが作成できない
-
GASでundefinedエラーが出ます
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
関数でy=g(x)のgとは何の略です...
-
functionから別のfunctionを実...
-
idを使わずにonclickで自身の要...
-
関数名をテキストから読み込む...
-
javascript(jQuery)でセル内...
-
Matlabで自作関数をオーバーロード
-
クリックすると上に開くアコー...
-
XMLHttpRequestオブジェクトが...
-
jslintのエラーについて質問
-
ajax反映後のjqueryが動かない
-
jQueryの :not() .not() が有効...
-
XMLHttpRequestでキャッシュを...
-
jqueryの変数を関数の外に出す方法
-
コードをスマートにさせたい。
-
要素名がスペースを含む場合のj...
-
jQuery 同じ処理を関数にまとめ...
-
処理前の「お待ちください」
-
jQuery|要素だけを変更できま...
-
jQueryの"return false"の役割...
-
【JavaScript】二重送信防止
おすすめ情報