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
    }
}, {})

JsFiddle