我要么找到MatchData
对象的长度,要么找到找到的字符串中最后一个元素的索引。所以我可以在它之后插入另一个字符串。
找到的字符串的长度未知,因为此代码将在许多不同的网站上运行。
我拉下一根绳子(它是一个液体模板,需要保持液态,不能转换成HTML,所以Nokogiri不是一个选项)
我正在搜索的字符串是一个表单标记,可以是任意长度,在本例中它看起来像这样:
<form action="/cart" method="post" novalidate class="cart-wrapper">
我也可以找到FIRST元素的索引:
string.index(/\<form.*\>/)
我尝试使用rindex
,但返回的值与index
我可以像这样返回表单标记:
found = string.match(/\<form.*\>/)
以上内容返回MatchData
个对象,但如果我这样做:
found.size
found.length
它返回的全部是1
我的想法是获取form
标记的索引,然后在表单标记本身中添加字符数,然后在此之后插入我的字符串。但由于某种原因,我无法找到最后一个字符的索引或MatchData
的长度。
我哪里误入歧途?
答案 0 :(得分:2)
试试这个,
last_index = str.index(/\<form.*\>/) + str[/\<form.*\>/].size
这是如何运作的?
str.index
返回正则表达式的起始索引str.[...]
返回匹配本身size
获取比赛的长度然而,
看起来你正在操纵一个html字符串。最好使用nokogiri
宝石
require 'nokogiri'
doc = Nokogiri::HTML(str)
form = doc.at('form')
form.inner_html = '<div>new content</div>' + form.inner_html
puts doc
这会在form
代码中添加新内容。
答案 1 :(得分:0)
您可以按如下方式插入字符串。
def insert_str(str, regex, insert_str)
idx = str.match(regex).end(0)
return nil if idx.nil?
str[0,idx]+insert_str+str[idx..-1]
end
str = '<form action="/cart" method="post" novalidate class="cart-wrapper">'
#=> "<form action=\"/cart\" method=\"post\" novalidate class=\"cart-wrapper\">"
insert_str(str, /\<form.*\>/, "cat")
#=> "<form action=\"/cart\" method=\"post\" novalidate class=\"cart-wrapper\">cat"
str
#=> "<form action=\"/cart\" method=\"post\" novalidate class=\"cart-wrapper\">"
insert_str("How now, brown cow?", /\bbrown\b/, " or blue")
#=> "How now, brown or blue cow?"
见MatchData#end。如果您想改变str
,请按如下方式修改方法。
def insert_str(str, regex, insert_str)
idx = str.match(regex).end(0)
return nil if idx.nil?
str.insert(idx, insert_str)
end
str = '<form action="/cart" method="post" novalidate class="cart-wrapper">'
insert_str(str, /\<form.*\>/, "cat")
#=> "<form action=\"/cart\" method=\"post\" novalidate class=\"cart-wrapper\">cat"
str
#=> "<form action=\"/cart\" method=\"post\" novalidate class=\"cart-wrapper\">cat"