Class: String

Inherits:
Object show all
Defined in:
lib/arachni/ruby/string.rb

Overview

Overloads the String class.

Instance Method Summary collapse

Instance Method Details

#binary?Boolean

Returns:

  • (Boolean)


127
128
129
130
131
132
# File 'lib/arachni/ruby/string.rb', line 127

def binary?
    # Stolen from YAML.
    encoding == Encoding::ASCII_8BIT ||
        index("\x00") ||
        count("\x00-\x7F", "^ -~\t\r\n").fdiv(length) > 0.3
end

#diff_ratio(other) ⇒ Float

Calculates the difference ratio (at a word level) between self and other

Parameters:

Returns:

  • (Float)

    0.0 (identical strings) to 1.0 (completely different)



66
67
68
69
70
71
72
73
74
75
76
# File 'lib/arachni/ruby/string.rb', line 66

def diff_ratio( other )
    return 0.0 if self == other

    s_words = self.words( true )
    o_words = other.words( true )

    common = (s_words & o_words).size.to_f
    union  = (s_words | o_words).size.to_f

    (union - common)/union
end

#persistent_hashInteger

Returns In integer with the property of:

If ‘str1 == str2` then `str1.persistent_hash == str2.persistent_hash`.

It basically has the same function as Ruby’s #hash method, but does not use a random seed per Ruby process – making it suitable for use in distributed systems.

Returns:

  • (Integer)

    In integer with the property of:

    If ‘str1 == str2` then `str1.persistent_hash == str2.persistent_hash`.

    It basically has the same function as Ruby’s #hash method, but does not use a random seed per Ruby process – making it suitable for use in distributed systems.



100
101
102
# File 'lib/arachni/ruby/string.rb', line 100

def persistent_hash
    Zlib.crc32 self
end

#rdiff(other) ⇒ String

Gets the reverse diff between self and str on a word level.

str = "This is the first test.\nNot really sure what else to put here...\n"

str2 = "This is the second test.\nNot really sure what else to put here...\nBoo-Yah!\n"

str.rdiff( str2 )
# => "This is the test.\nNot really sure what else to put here...\n"

Parameters:

Returns:



49
50
51
52
53
54
55
56
57
# File 'lib/arachni/ruby/string.rb', line 49

def rdiff( other )
    return self if self == other

    # get the words of the first text in an array
    s_words = words

    # get what hasn't changed (the rdiff, so to speak) as a string
    (s_words - (s_words - other.words)).join
end

#recodeObject



122
123
124
# File 'lib/arachni/ruby/string.rb', line 122

def recode
    dup.recode!
end

#recode!Object



117
118
119
120
# File 'lib/arachni/ruby/string.rb', line 117

def recode!
    force_encoding( 'utf-8' )
    encode!( 'utf-16be', invalid: :replace, undef: :replace ).encode( 'utf-8' )
end

#repackObject



113
114
115
# File 'lib/arachni/ruby/string.rb', line 113

def repack
    unpack( 'C*' ).pack( 'U*' )
end

#substring?(string) ⇒ Boolean

Returns:

  • (Boolean)


104
105
106
107
108
109
110
111
# File 'lib/arachni/ruby/string.rb', line 104

def substring?( string )
    begin
        cmatch = match( Regexp.new( Regexp.escape( string ) ) )
        cmatch && !cmatch.to_s.empty?
    rescue
        nil
    end
end

#words(strict = false) ⇒ Array<String>

Returns the words in self.

Parameters:

  • strict (Bool) (defaults to: false)

    include only words, no boundary characters (like spaces, etc.)

Returns:



85
86
87
88
89
# File 'lib/arachni/ruby/string.rb', line 85

def words( strict = false )
    splits = split( /\b/ )
    splits.reject! { |w| !(w =~ /\w/) } if strict
    splits
end