文字列の部分取り出しについて

[新着] Webテンプレートを仮オープンしました



0   名前: 匿名 : 2007/08/24(金) 18:10  ID:vwM0aSCv sub-PK
htmlで<title>固定文(個別文)</title>でセットされた文字列から
( )内の個別文だけ取得できるjavascript , 関数はありますでしょうか?
固定文はsplitで抜き出すことはできたのですが可能でしょうか

よろしくお願いいたします





1   名前: NullPo : 2007/08/24(金) 18:10  ID:Gi4nGlfX sub-.G
<title>固定文(個別文)</title>
の文字列から固定文を取り出せたのなら、substringメソッドで事は足りると思う。

2   名前: 匿名 : 2007/08/24(金) 18:10  ID:vwM0aSCv sub-PK
nullpoさんご返信ありがとうございます。
substringメソッドをテストしてみましたが、値を取り出すことはできませんでした。

stringはやはり開始位置、終了位置は数字になりますよね?
split("|")のような文字を指定できないでしょうか 例えば ("(",")");のような範囲設定です。

皆様よろしくお願いいたします。

3   名前: miz : 2007/08/24(金) 18:10  ID:BkizBQtM sub-.G
固定文をどういうsplitで抜き出したのか不明だけど、前後の文字で分割したのなら同様のことをやればいいのでは?
例1
var html_data = '<title>固定文(個別文)</title>';
var str_array1 = html_data.split( '(' );
var str_array2 = str_array1[1].split( ')' );
var str_inner = atr_arry2[0];

substring は、これを使う前に indexOf で文字位置をチェックすればいいだけですよ。
例2
var start = html_data.indexOf( '(' ) +1;
var end = html_data.indexOf( ')' ) ;
var str ='';
if(start>0 && start<end ){
str = html_data.substring( start,end);
}

4   名前: NullPo : 2007/08/24(金) 18:10  ID:Gi4nGlfX sub-.G
>>3
固定文に"("の文字があったときそのコードではバグが。。。

固定文は取り出せているから、固定文.lengthで文字数計算してsubstringメソッドで切り出したほうがいいと思う。

5   名前: 匿名 : 2007/08/24(金) 18:10  ID:RRwY88x6 sub-Ax
固定文は取り出せているとのことですが、

いちおう、こんなん考えてみました。
var str = '<title>固定文(個別文)</title>';
var ret = str.match( /^<title>([^\)]*)(?:\((.*?)\))?[^\)]*<\/title>$/i );
ret[0] にはマッチした文字列(全体)が入ります。
ret[1] には固定文が入ります。
ret[2] には個別文が入ります。

var str = '<title>固定文(個別文)文</title>'
のように(個別文)の後ろに何か文があったときとか、
var str = '<title>固定文</title>'
のように個別文がなかったときとか、逆に固定文がなかったときとか、
あとは〜
var str = '<title>**(**(**(**)</title>'
のように「(」がいくつかあったとき
など、いろいろ考え出しちゃうと、私の頭ではすぐに限界がきてしまうわけですが…w。

…なんか、もっとうまい正規表現があるはずです…。

6   名前: 匿名 : 2007/08/24(金) 18:10  ID:RRwY88x6 sub-Ax
"個別文を取り出す"ことだけに注目して作ってみました。
いちおー…、いろいろな場合を想定してみました。
※固定文は取り出せません。
<HTML>
<HEAD>
<SCRIPT type="text/javascript">

function $( id ) { return document.getElementById( id ); }

//*************************************************************************************************
function Initialize()
{
    // 個別文の抜き出し
    // 〜(*1)</title> => ret[1] = *1
    // 〜(*1)〜</title> => ret[1] = *1
    // 〜(*1</title> => ret[1] = *1
    // 〜(*1 => ret[1] = *1
    // 〜(*1\n*2)</title> => ret[1] = *1\n*2
    // 〜(*1\n*2)〜</title> => ret[1] = *1\n*2
    // 〜(*1\n*2 => ret[1] = *1\n*2
    var strs = [
        '正常時 : <title>固定文(個別文)</title>',
        // ↓その他
        'ミス時 : <title>固定文</title>',
        'ミス時 : <title>固定文個別文)</title>',
        'ミス時 : <title>〜(〜(個別文)</title>',
        'ミス時 : <title>〜(〜(個別文)〜)</title>',
        'ミス時 : <title>〜(〜(〜〜)〜(個別文)〜)</title>',
        'ミス時 : <title>〜(個別文)〜</title>',
        'ミス時 : <title>〜(個別文</title>',
        'ミス時 : <title>〜(個別文/title>',
        'ミス時 : <title>〜(個別文',
        'ミス時 : <title>〜(個別\n文)</title>',
        'ミス時 : <title>〜(個別\n文)〜</title>',
        'ミス時 : <title>〜(個別\n文'
    ];
    for( var i=0; i<strs.length; i++ )
    {
        var objRow = $( 'ID_TABLE1' ).insertRow( $( 'ID_TABLE1' ).rows.length );
        objRow.insertCell( objRow.cells.length ).appendChild( document.createTextNode( strs[i].replace(/\n/g,'\\n') ) );
        objRow.insertCell( objRow.cells.length ).appendChild( document.createTextNode( ' => ' ) );
        var objCell = objRow.insertCell( objRow.cells.length );
        objCell.style.color = '#FF0000';
        objCell.appendChild( document.createTextNode( '['+getKobetu( strs[i] ).replace(/\n/g,'\\n')+']' ) );
    }
}

function getKobetu( str )
{
    //if( str.constructor != String ) return '';
    // ↑new String(*)にも対応させるなら上
    if( typeof(str) != 'string' ) return '';
    // ↓個別文取り出しの正規表現
    var ret = str.match( /(?:\(([^\(\)<]*)(?:\)[^\(]*$|<\/title>|$(?!\n)))/i );
    if( ret ) return ret[ ret.length - 1 ];
    return '';
}

if( window.addEventListener ) window.addEventListener( 'load', Initialize, false );
else if( window.attachEvent ) window.attachEvent( 'onload', Initialize );
else window.onload = Initialize;

</SCRIPT>
</HEAD>
<BODY>

  <DIV id='ID_DIV1'>
    <TABLE id='ID_TABLE1' cellpadding='4' cellspacing='0'>
      <TBODY>
      </TBODY>
    </TABLE>
  </DIV>

</BODY>
</HTML>

window上にて
IE6, Sarafi3.0.6 Netscape7.1 Firefox2.0.0.6 Opera9.22
確認

7   名前: Chips : 2007/08/24(金) 18:10  ID:iXTrKUp6 sub-FV
例外とか考えずにシンプルに…
<html>
<head>
<title>固定文(個別文)</title>
</head>
<body>
<script type="text/javascript">
document.title.match(/(.*?)\((.*?)\)/);
document.write('<h1>'+RegExp.$1+'<'+'/h1>');
document.write('<h2>'+RegExp.$2+'<'+'/h2>');
</script>
</body>
</html>

8   名前: 匿名 : 2007/08/24(金) 18:10  ID:efB2AAwq sub-Cz
>>6
title 要素の中身には document.title(最悪 getElementsByTagName)で参照できるから、自前でのタグ処理は避けた方が良いよ。タグ処理は DOM パーサに任せ、俺らはデータ処理のみに専念しよう。

>>7
RegExp.$1 などは ECMA 非準拠で、JavaScript 1.5 から非推奨になってる。
var result = document.title.match(/^([^(]*)?\(([^)]*)\)?/);

みたいにすれば、result は確実に null 以外の結果になるし、result[2] には括弧内のデータ(括弧がなければ空文字列)が入る。ただし、ネストは考慮していない。


つーか、どういうデータがありうるのか、括弧がネストする可能性があるのか、なぜ固定文なのに固定値を使わないようにしたいのか、もう少し説明してくれないと困るぜよ>スレ主。

一覧へ戻る