我有以下字符串(field_data
):
<fieldset>
<div class='control-group'>
<h5>New Side Dish</h5>
<input id="menu_dishes_attributes_1344897592128_side_dishes_attributes_70308623619760_name" name="menu[dishes_attributes][1344897592128][side_dishes_attributes][70308623619760][name]" placeholder="Name" size="30" type="text" />
<input id="menu_dishes_attributes_1344897592128_side_dishes_attributes_70308623619760__destroy" name="menu[dishes_attributes][1344897592128][side_dishes_attributes][70308623619760][_destroy]" type="hidden" value="false" />
<input id="menu_dishes_attributes_1344897592128_side_dishes_attributes_70308623619760_price" name="menu[dishes_attributes][1344897592128][side_dishes_attributes][70308623619760][price]" placeholder="Price" size="30" type="text" />
<input id="menu_dishes_attributes_1344897592128_side_dishes_attributes_70308623619760_restaurant_id" name="menu[dishes_attributes][1344897592128][side_dishes_attributes][70308623619760][restaurant_id]" type="hidden" />
<a href="#" class="remove_fields">X</a>
</div>
</fieldset>
我希望获取[side_dishes_attributes]
和[restaurant_id]
之间的数字70308623619760
,而且只是第一次出现或最后一次出现,但我基本上只需要一个实例。
我知道你可以使用正则表达式和过滤器,但每当我使用其中任何一个时,它要么返回字符串中的所有数字,要么在不正确的输出中显示所有数字集。
我抓取的数字不是静态的,所以它会改变代码的每次迭代,但名称side_dishes_attributes
和restaurant_id
是不变的。
这是我到目前为止所尝试的内容,以下是输出:
field_data = $(this).data('fields')
start_pos = field_data.indexOf("side_dishes_attributes][")
end_pos = field_data.indexOf("][_destroy]", start_pos)
result_text = field_data.substring(start_pos, end_pos)
console.log("Result:", result_text)
输出:
Result: side_dishes_attributes][70208369492160][name]" placeholder="Name" size="30" type="text" /> <input id="menu_dishes_attributes_70208370296900_side_dishes_attributes_70208369492160__destroy" name="menu[dishes_attributes][70208370296900][side_dishes_attributes][70208369492160
我试过了:
result = field_data.replace(/[^0-9]/g, "")
console.log(result)
输出:
227020836200328070208362003280702083620032803070208...
我也试过玩这个:
http://rubular.com/r/r5iowGGmw4
但我对正则表达式了解不多,无法使其正常工作。
我很感激任何指针。我在jQuery Coffeescript中做了所有这些(但如果你只用jQuery向我展示代码,我也可以将它转换过来。)
start_pos = field_data.indexOf("side_dishes_attributes][") + 24
end_pos = field_data.indexOf("][name]", start_pos)
result_text = field_data.substring(start_pos, end_pos)
console.log("Result", result_text)
我得到了正确的输出,但我想知道是否有更好的方法。
答案 0 :(得分:2)
如果您的HTML字符串存储在变量中,例如str
,则可以执行以下操作:
var matches = str.match(/side_dishes_attributes_(\d+)_/);
var number = matches[1];
这将为您提供一个包含两个元素的数组。第一个是与正则表达式“side_dishes_attributes_70308623619760”匹配的完整字符串,第二个是由括号“70308623619760”捕获的字符串。 matches[1]
将包含您的电话号码。
通过省略g
修饰符,表达式只匹配一次,因此它将返回第一个输入的id
中包含的数字
答案 1 :(得分:1)
虽然我同意@Luke和@jackwanders其他方法是可取的,如果你真的只有一个字符串中的数据,这里是一个正则表达式我相信会做的伎俩:
data.match /\[side_dishes_attributes\]\[(.*)\]\[restaurant_id\]/
答案 2 :(得分:1)
试试这个:
$('.control-group input').each(function() {
var match = $(this).attr('id').match(/side_dishes_attributes_(\d*)_restaurant_id/);
if (match) {
alert(match[1]); // -> 70308623619760
return false;
}
});
它会循环遍历所有输入元素,如果找到匹配则会中断。
答案 3 :(得分:0)
我假设您正在从服务器构建此ID。那么为什么不在rel
等其他html属性中添加该数字?