1

文字列を 500 文字未満のチャンクに分割し、それを配列に入れたいと思います。これは簡単に解決できます。

私の問題は、文字列に html コードが含まれており、分割が < > ブラケットの外側で発生する必要があることです。誰でもそれを行う方法を知っていますか?

それが私が現在得ているものです。

while article.length > 0 do
  textarr << article[0, 499]
  article[0, 499] = ""
end

分割が html コードに切り込まれていないことを確認する方法を教えてもらえますか? ありがとう

4

2 に答える 2

3
textarr = article.scan(/.{1,500}(?![^<>]*>)/m)

文字列を最大500文字(可能な限り多く)のチャンクに分割し、必要に応じてチャンクのサイズを縮小して、次の山かっこが閉じ角かっこにならないようにします。

于 2012-12-16T14:00:02.703 に答える
1

整形式の 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 が=~返され (文字列の先頭に一致するため)、無限ループに陥ります。

于 2012-12-16T13:51:09.260 に答える