Uzaklıklar ve sınırlayıcı yakalamak için yakut PHPs preg_split taklit etmek nasıl?

3 Cevap php

Ben PHP preg_split için yakut tuvale benzeyen bir dize bölme am süre uzaklıklar ve ayraçları almak için bir yol olup olmadığını merak ediyorum:

preg_split("/( |&nbsp;|<|>|\t|\n|\r|;|\.)/i", $html_string, -1, PREG_SPLIT_DELIM_CAPTURE|PREG_SPLIT_OFFSET_CAPTURE);

Ben karakterlerin dizisini gezinmesi ya da ağacın tepesinde gibi ağır bir şey kullanarak bunu elde edebilirsiniz hayal, ama daha uygun bir şey kullanmak istiyorum.

3 Cevap

Aradığınız MatchData#offset or MatchData#begin , which you can access on Regexp.last_match or $~ konum:

html_string.scan(/( |&nbsp;|<|>|\t|\n|\r|;|\.)/i) do |match|
  # Returns begin and end position for this match, e.g. [5, 10]
  Regexp.last_match.offset(0)
end

Örneğin, Ruby $~ adlı uzaklıklar getirebilir:

"foobarbaz".scan(/[oa]+/) { p [$~.begin(0), $~.end(0), $~.to_s] }

baskılar

[1, 3, "oo"]
[4, 5, "a"]
[7, 8, "a"]

Buna dayanarak size PHP kodu olduğu gibi aynı uzaklıklar üreten bir döngü yazabilirsiniz.

Böyle bir yaklaşımı bilmek çok yararlı hem de çözümleri için teşekkürler. Ben taramayı kullanmak eğer ben maçlar arasında bir şeyler almak için mantığı eklemek zorunda. Aynı etki Telli # indeksi kullanılarak hatları benzer bir miktarı ile elde edilebilir. Çok kötü Dize # bölünmüş bir blok almaz

def html_split(str)
  DELIMITERS = /(&nbsp;|[\s<>;.])/i
  data = []
  offset = 0
  i = str.index(DELIMITERS)
  while i do
    if i > 0
      value = str[0...i]
      data << [value, offset] 
      offset += i
    end
    delimiter = str[i..i] == '&' ? str[i..i+6] : str[i..i]
    data << [delimiter, offset]
    offset += delimiter.size
    str = str[(i + delimiter.size)..-1]
    i = str.index(DELIMITERS)
  end
  data
end