
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を探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
functionから別のfunctionを実...
-
関数でy=g(x)のgとは何の略です...
-
idを使わずにonclickで自身の要...
-
一つのアクションで関数を二つ...
-
jQueryの :not() .not() が有効...
-
jQuery|要素だけを変更できま...
-
Matlabで自作関数をオーバーロード
-
ajax反映後のjqueryが動かない
-
引数に関して
-
ローカルにあるファイルを検索...
-
jspからjavascriptの変数引継ぎ
-
C#テキストボックスの文字を配...
-
javascript new演算子について...
-
同じIDで定義した要素の配列を...
-
ASP.NETのコントロールの値をJa...
-
javascriptでiframeのURL変更は?
-
C# 演算 奇数と偶数 表現の仕方
-
for文のiを使ってリンク先のア...
-
Latexに関する質問です。
-
ASP+アクセスでのSQLコメントに...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
functionから別のfunctionを実...
-
idを使わずにonclickで自身の要...
-
クリックすると上に開くアコー...
-
関数でy=g(x)のgとは何の略です...
-
ページ内に複数表がある場合のT...
-
jQueryの :not() .not() が有効...
-
関数名をテキストから読み込む...
-
jqueryの変数を関数の外に出す方法
-
javascript(jQuery)でセル内...
-
XMLHttpRequestでキャッシュを...
-
要素名がスペースを含む場合のj...
-
jQueryの"return false"の役割...
-
処理前の「お待ちください」
-
[jQuery] クリックで連番関数を...
-
ajax反映後のjqueryが動かない
-
jQueryにて、.toggle()でアニメ...
-
Tabキーのキャンセル
-
XMLHttpRequestオブジェクトが...
-
JScriptの問題です。添削お願い...
-
jquery 複数のメソッド
おすすめ情報