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]との間の数を取得したいのですが、基本的にはそのインスタンスを1つだけ必要とします。[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

しかし、これを正しく機能させるための正規表現についてはよくわかりません。

ポインタをいただければ幸いです。私はこれをすべてjQueryCoffeescriptで行っています(ただし、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];

これにより、2つの要素を持つ配列が得られます。1つ目は正規表現「side_dishes_attributes_70308623619760」に一致する完全な文字列で、2つ目は括弧「70308623619760」でキャプチャされた文字列です。matches[1]あなたの番号が含まれます。

修飾子gを省略すると、式は1回だけ一致するため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 に答える