split() 在表单提交中使用新行时切断重要的表单输入信息
split() cutting off important form entry information when a new line is used in form submission
我正在尝试传递来自 Woocommerce 订单上重力表单提交的信息,以便在另一个使用 Zapier 的应用程序中使用。我需要拆分表单输入信息,这样信息就不会全部在一行中,可以单独访问。
由于我是 JavaScript 的新手,我已经苦苦挣扎了几个小时,试图让它发挥作用...我使用的代码来自 woocommerce 文档。问题在于,如果所述信息继续到新行,则可能会切断一大块信息。请参阅下面的拆分结果,并参考问题2以了解我在说什么。
代码:
// Define "metaData" in the Input Data section. Ignore the "No Data" label.
// Reformat Resource Meta Data to generate keyvalue pairs.
// In case of multiple equal keys, only the last value available.
const buffer = {};
const metaData = inputData.metaData.split(/\n+/);
metaData.forEach((dataString, index) => {
if (dataString.includes('id:')) {
const key = metaData[index + 1].replace('key:', '').trim();
const value = metaData[index + 2].replace('value:', '').trim();
buffer[key] = value;
}
});
return buffer;
表单提交示例如下:
Name: John
Last Name: Doe
Email: john.doe@gmail.com
Question 1: this is my first question
Question 2: hi there,
this is my second question..
regards, john doe
Question 3: This is my third question
拆分的结果是什么样的:
Name: John
Last Name: Doe
Email: john.doe@gmail.com
Question 1: this is my first question
Question 2: hi there,
Question 3: This is my third question
如您所见,问题 2 基本上没有了。我一直无法找到一种方法来解决这个问题。我希望有人能够在这里帮助我...
编辑:
__________________
RAW 请求:
id: 419*** key: _gravity_forms_history value: {'_gravity_form_cart_item_key': '************************************', '_gravity_form_linked_entry_id': ****, '_gravity_form_lead': {'2': 'This is my first question', '6': 'john.doe@gmail.com', '7': '2020-08-01', '8': 'hi there,\r\nthis is my second question..\r\n\r\nregards, john doe', '9': 'This is my third question', '11': 0, '12': this is a random form entry', 'form_id': '3', 'source_url': 'https://***************************/', 'ip': ***************', '5.2': '', '5.3': 'John', '5.4': '', '5.6': 'Doe', '5.8': '', '10.1': 'Product Name', '10.2': '[=13=].00', '10.3': '1'}, '_gravity_form_data': {'id': '3', 'bulk_id': 0, 'display_title': False, 'display_description': False, 'disable_woocommerce_price': 'no', 'price_before': '', 'price_after': '', 'disable_calculations': 'yes', 'disable_label_subtotal': 'yes', 'disable_label_options': 'yes', 'disable_label_total': 'yes', 'disable_anchor': 'no', 'label_subtotal': 'Subtotal', 'label_options': 'Options', 'label_total': 'Total', 'use_ajax': 'no', 'enable_cart_edit': 'no', 'enable_cart_edit_remove': 'yes', 'keep_cart_entries': 'no', 'send_notifications': 'no', 'enable_cart_quantity_management': 'no', 'cart_quantity_field': '', 'update_payment_details': 'no', 'display_totals_location': 'after', 'structured_data_override': 'no', 'structured_data_low_price': '', 'structured_data_high_price': '', 'structured_data_override_type': 'append'}}
id: 419***
key: Name
value: John Doe
id: 419***
key: Email
value: john.doe@gmail.com
id: 419***
key: Date of Birth
value: 01.08.2020
id: 419***
key: Question 1
value: This is my first question
id: 419***
key: Question 2
value: hi there,
this is my second question..
regards, john doe
id: 419***
key: Question 3
value: This is my third question
id: 419***
key: Final Entry (Optional)
value: this is a random form entry
要求的预期结果:
Name: John Doe
Email: john.doe@gmail.com
Date of Birth: 01.08.2020
Question 1: This is my first question
Question 2 :Hi There,
This Is My Second Question..
Regards, John Doe
Question 3: This is my third question
Final Entry: this is a random form entry
id: ******************************
runtime_meta:
memory_used_mb: 72
duration_ms: 100
logs:
async: false
请求的当前结果:
Name: John Doe
Email: john.doe@gmail.com
Date of Birth: 01.08.2020
Question 1: This is my first question
Question 2 :Hi There,
Question 3: This is my third question
Final Entry: this is a random form entry
id: ******************************
runtime_meta:
memory_used_mb: 72
duration_ms: 100
logs:
async: false
What the result of the split looks like:
Name: John
Last Name: Doe
Email: john.doe@gmail.com
Question 1: this is my first question
Question 2: hi there,
Question 3: This is my third question
不不不不不不。这就是你认为分裂的结果。您的代码中存在错误,并且您选择相信 split
函数而不是您的代码有问题。
在您的 forEach
循环中,添加一行
console.log('XXXX', dataString);
紧靠 if (dataString.includes('id:')) {
行上方。您会看到输入的每一行都以 XXXX
前缀注销,包括您声称丢失的那些。
那么为什么 是 您的代码没有按照您的要求执行?好吧,我们来看看forEach
:
调用的函数的内容
if (dataString.includes('id:')) {
const key = metaData[index + 1].replace('key:', '').trim();
const value = metaData[index + 2].replace('value:', '').trim();
buffer[key] = value;
}
它有什么作用?如果文件的一行包含 id:
,则从下一行和下一行中获取键和值。如果文件的一行不包含 id:
,请不要对其进行任何操作。
在您的情况下,问题 2 包含不止一行,正如我们所见,您的代码完全忽略了这一行。
如果您不只是将 line-after-next 读取到值中,而是想读取所有行直到但不包括其中包含 id:
的下一行,请尝试以下操作:
if (dataString.includes('id:')) {
const key = metaData[index + 1].replace('key:', '').trim();
let value = metaData[index + 2].replace('value:', '').trim();
let index2 = index + 3;
while (index2 < metaData.length && !metaData[index2].includes('id:')) {
value += "\n" + metaData[index2].trim();
index2 += 1;
}
buffer[key] = value.trim();
}
您可以使用正则表达式分隔条目,然后将结果缩减为键值对
const inputMatch = inputData.metaData.match(/id(.|\n|\r)+?(?=$|id)/g)
const buffer = inputMatch.reduce((acc, objectString) => {
const key = objectString.substring(objectString.indexOf('key:') + 4, objectString.indexOf('value:')).trim()
const value = objectString.substring(objectString.indexOf('value:') + 6, objectString.length).trim()
return {
...acc,
[key]: value
}
}, {})
我正在尝试传递来自 Woocommerce 订单上重力表单提交的信息,以便在另一个使用 Zapier 的应用程序中使用。我需要拆分表单输入信息,这样信息就不会全部在一行中,可以单独访问。
由于我是 JavaScript 的新手,我已经苦苦挣扎了几个小时,试图让它发挥作用...我使用的代码来自 woocommerce 文档。问题在于,如果所述信息继续到新行,则可能会切断一大块信息。请参阅下面的拆分结果,并参考问题2以了解我在说什么。
代码:
// Define "metaData" in the Input Data section. Ignore the "No Data" label.
// Reformat Resource Meta Data to generate keyvalue pairs.
// In case of multiple equal keys, only the last value available.
const buffer = {};
const metaData = inputData.metaData.split(/\n+/);
metaData.forEach((dataString, index) => {
if (dataString.includes('id:')) {
const key = metaData[index + 1].replace('key:', '').trim();
const value = metaData[index + 2].replace('value:', '').trim();
buffer[key] = value;
}
});
return buffer;
表单提交示例如下:
Name: John
Last Name: Doe
Email: john.doe@gmail.com
Question 1: this is my first question
Question 2: hi there,
this is my second question..
regards, john doe
Question 3: This is my third question
拆分的结果是什么样的:
Name: John
Last Name: Doe
Email: john.doe@gmail.com
Question 1: this is my first question
Question 2: hi there,
Question 3: This is my third question
如您所见,问题 2 基本上没有了。我一直无法找到一种方法来解决这个问题。我希望有人能够在这里帮助我...
编辑: __________________
RAW 请求:
id: 419*** key: _gravity_forms_history value: {'_gravity_form_cart_item_key': '************************************', '_gravity_form_linked_entry_id': ****, '_gravity_form_lead': {'2': 'This is my first question', '6': 'john.doe@gmail.com', '7': '2020-08-01', '8': 'hi there,\r\nthis is my second question..\r\n\r\nregards, john doe', '9': 'This is my third question', '11': 0, '12': this is a random form entry', 'form_id': '3', 'source_url': 'https://***************************/', 'ip': ***************', '5.2': '', '5.3': 'John', '5.4': '', '5.6': 'Doe', '5.8': '', '10.1': 'Product Name', '10.2': '[=13=].00', '10.3': '1'}, '_gravity_form_data': {'id': '3', 'bulk_id': 0, 'display_title': False, 'display_description': False, 'disable_woocommerce_price': 'no', 'price_before': '', 'price_after': '', 'disable_calculations': 'yes', 'disable_label_subtotal': 'yes', 'disable_label_options': 'yes', 'disable_label_total': 'yes', 'disable_anchor': 'no', 'label_subtotal': 'Subtotal', 'label_options': 'Options', 'label_total': 'Total', 'use_ajax': 'no', 'enable_cart_edit': 'no', 'enable_cart_edit_remove': 'yes', 'keep_cart_entries': 'no', 'send_notifications': 'no', 'enable_cart_quantity_management': 'no', 'cart_quantity_field': '', 'update_payment_details': 'no', 'display_totals_location': 'after', 'structured_data_override': 'no', 'structured_data_low_price': '', 'structured_data_high_price': '', 'structured_data_override_type': 'append'}}
id: 419***
key: Name
value: John Doe
id: 419***
key: Email
value: john.doe@gmail.com
id: 419***
key: Date of Birth
value: 01.08.2020
id: 419***
key: Question 1
value: This is my first question
id: 419***
key: Question 2
value: hi there,
this is my second question..
regards, john doe
id: 419***
key: Question 3
value: This is my third question
id: 419***
key: Final Entry (Optional)
value: this is a random form entry
要求的预期结果:
Name: John Doe
Email: john.doe@gmail.com
Date of Birth: 01.08.2020
Question 1: This is my first question
Question 2 :Hi There,
This Is My Second Question..
Regards, John Doe
Question 3: This is my third question
Final Entry: this is a random form entry
id: ******************************
runtime_meta:
memory_used_mb: 72
duration_ms: 100
logs:
async: false
请求的当前结果:
Name: John Doe
Email: john.doe@gmail.com
Date of Birth: 01.08.2020
Question 1: This is my first question
Question 2 :Hi There,
Question 3: This is my third question
Final Entry: this is a random form entry
id: ******************************
runtime_meta:
memory_used_mb: 72
duration_ms: 100
logs:
async: false
What the result of the split looks like:
Name: John Last Name: Doe Email: john.doe@gmail.com Question 1: this is my first question Question 2: hi there, Question 3: This is my third question
不不不不不不。这就是你认为分裂的结果。您的代码中存在错误,并且您选择相信 split
函数而不是您的代码有问题。
在您的 forEach
循环中,添加一行
console.log('XXXX', dataString);
紧靠 if (dataString.includes('id:')) {
行上方。您会看到输入的每一行都以 XXXX
前缀注销,包括您声称丢失的那些。
那么为什么 是 您的代码没有按照您的要求执行?好吧,我们来看看forEach
:
if (dataString.includes('id:')) {
const key = metaData[index + 1].replace('key:', '').trim();
const value = metaData[index + 2].replace('value:', '').trim();
buffer[key] = value;
}
它有什么作用?如果文件的一行包含 id:
,则从下一行和下一行中获取键和值。如果文件的一行不包含 id:
,请不要对其进行任何操作。
在您的情况下,问题 2 包含不止一行,正如我们所见,您的代码完全忽略了这一行。
如果您不只是将 line-after-next 读取到值中,而是想读取所有行直到但不包括其中包含 id:
的下一行,请尝试以下操作:
if (dataString.includes('id:')) {
const key = metaData[index + 1].replace('key:', '').trim();
let value = metaData[index + 2].replace('value:', '').trim();
let index2 = index + 3;
while (index2 < metaData.length && !metaData[index2].includes('id:')) {
value += "\n" + metaData[index2].trim();
index2 += 1;
}
buffer[key] = value.trim();
}
您可以使用正则表达式分隔条目,然后将结果缩减为键值对
const inputMatch = inputData.metaData.match(/id(.|\n|\r)+?(?=$|id)/g)
const buffer = inputMatch.reduce((acc, objectString) => {
const key = objectString.substring(objectString.indexOf('key:') + 4, objectString.indexOf('value:')).trim()
const value = objectString.substring(objectString.indexOf('value:') + 6, objectString.length).trim()
return {
...acc,
[key]: value
}
}, {})