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.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>
---
No.3
- 回答日時:
ExtendScript Toolkit上では動きました
<が処理の段階ではエスケープされてて
<になってるとかじゃないでしょうか
でも#1の方のいわれてるように
最小一致にはしておいたほうがいいかと思います
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.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操作。
そうでないなら、正規表現で置換するという選択肢もありかなと思います。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- レシピ・食事 https://www.yutori.co.jp/shop/rp/rp201449/ このレシピって 1 2022/07/24 12:27
- 写真 EOS RPは何であんなにも安いのですか? 2 2022/05/16 23:28
- 宇宙科学・天文学・天気 天王星 4 2022/11/14 14:01
- 電車・路線・地下鉄 初台→新宿3→代官山(7.6km)IC528円 笹塚→新宿3→中目黒(10.2Km)IC433円なぜ 5 2022/11/24 09:26
- 写真 今ミラーレス一眼カメラを買うなら5月31日に開催を噂されているXサミットを待った方がいいのでしょうか 2 2022/05/17 14:45
- 数学 多様体の質問です。 S^1={(a_1,a_2)|a_1^2+a_2^2=1}と T^1=R/Z(R 1 2023/05/18 21:14
- その他(趣味・アウトドア・車) 寝台特急カシオペアについて 2 2023/06/10 13:59
- 車検・修理・メンテナンス ステップワゴンダッシュボードの下 1 2023/07/26 09:00
- デジタルカメラ 野球が好きで選手撮ってるんですけど、外野と内野と座る席はバラバラで、顔がはっきり見えて、ざらつきがあ 2 2023/07/11 19:50
- Ruby Ruby / passenger のインストールについて 1 2023/01/30 18:31
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
functionから別のfunctionを実...
-
関数でy=g(x)のgとは何の略です...
-
idを使わずにonclickで自身の要...
-
ドロップダウンメニューがデフ...
-
ページ内に複数表がある場合のT...
-
jQueryの :not() .not() が有効...
-
JAVAスクリプトで指定時間以降...
-
クリックすると上に開くアコー...
-
jQueryの"return false"の役割...
-
ASP 最終日の表示
-
【jQuery】for文ではイベント登...
-
javaScriptのコードの修正をお...
-
同じIDで定義した要素の配列を...
-
翌月を取得するGASが分かりません
-
ActiveXobjectが作成できない
-
ジェネレーターの作り方
-
google apps scriptの終了のさせ方
-
Javascriptのhtml出力についてa...
-
なぜmatchメソッドがエラーにな...
-
XMLでのAttributeを持ったNode...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
idを使わずにonclickで自身の要...
-
functionから別のfunctionを実...
-
関数でy=g(x)のgとは何の略です...
-
jslintのエラーについて質問
-
クリックすると上に開くアコー...
-
XMLHttpRequestでキャッシュを...
-
ajax反映後のjqueryが動かない
-
function(e)の意味を教えてくだ...
-
要素名がスペースを含む場合のj...
-
jQueryの :not() .not() が有効...
-
jQueryでzipを解凍読み込みする...
-
関数名をテキストから読み込む...
-
getElementByIdを使用したグロ...
-
jqueryuiのdialog
-
jqueryのグローバル変数とロー...
-
jQuery 同じ処理を関数にまとめ...
-
XMLHttpRequestオブジェクトが...
-
addEventListener()でリスナー...
-
drawImageの描画順序の指定につ...
-
javascript(jQuery)でセル内...
おすすめ情報