整形式の HTML (エンコードされていない<
外部タグがない)があると仮定すると、一致しない<
. 正規表現を使用できます:
"Lorem <b>ipsum</b" =~ /<[^>]*\Z/
# => 14
"Lorem <b>ipsum</b>" =~ /<[^>]*\Z/
# => nil
タグを切り取らないように分割を変更するには、この正規表現を使用して可変長のチャンクを取得できます (=~
一致が発生したインデックス、または一致がない場合は nil を返すことに注意してください)。
def chunk_length(chunk)
chunk =~ /<[^>]*\Z/ || chunk.length
end
textarr = []
start = 0
while start < article.length
length = chunk_length(article[start, 499])
# probably should check for length == 0 here in case you get a really long tag!
textarr << article[start, length]
start += length
end
length == 0
非常に長いタグがある場合は、チェックが必要になることがあります。次のような病的なものがあるとします
<div class="lots of classes" style="some: 'raw css';" data-attribute="more stuff" ...
それだけで 500 文字を超える可能性があります。次に、でarticle[start, 499]
始まる<
が終了の が含まれていないポイントに到達する>
ため、0 が=~
返され (文字列の先頭に一致するため)、無限ループに陥ります。