0

我有以下字符串(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

4 回答 4

2

如果您的 HTML 字符串存储在变量中,例如str,您可以执行以下操作:

var matches = str.match(/side_dishes_attributes_(\d+)_/);
var number = matches[1];

这将为您提供一个包含两个元素的数组。第一个是匹配正则表达式“side_disshes_attributes_70308623619760”的完整字符串,第二个是括号捕获的字符串,“70308623619760”。matches[1]将包含您的号码。

通过省略g修饰符,表达式只匹配一次,因此它将返回id第一个输入中包含的数字

于 2012-08-14T16:11:52.210 回答
1

虽然我同意@Luke 和@jackwanders 的观​​点,其他方法更可取,但如果你真的只有字符串中的数据,我相信这里有一个正则表达式可以解决问题:

data.match /\[side_dishes_attributes\]\[(.*)\]\[restaurant_id\]/
于 2012-08-14T16:06:15.713 回答
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;
    }
});​

如果找到匹配项,它将遍历所有输入元素并中断。

小提琴

于 2012-08-14T16:11:20.847 回答
0

我假设您正在从服务器构建此 ID。那么为什么不在另一个 html 属性中添加这个数字rel呢?

于 2012-08-14T16:04:59.363 回答