从两个特定单词之间的大字符串中抓取第一次出现的数字?

时间:2012-08-14 15:59:00

标签: jquery regex coffeescript

我有以下字符串(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_attributesrestaurant_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]&quot; placeholder=&quot;Name&quot; size=&quot;30&quot; type=&quot;text&quot; /&gt;    &lt;input id=&quot;menu_dishes_attributes_70208370296900_side_dishes_attributes_70208369492160__destroy&quot; name=&quot;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)

我得到了正确的输出,但我想知道是否有更好的方法。

4 个答案:

答案 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;
    }
});​

它会循环遍历所有输入元素,如果找到匹配则会中断。

FIDDLE

答案 3 :(得分:0)

我假设您正在从服务器构建此ID。那么为什么不在rel等其他html属性中添加该数字?