JavaScript中如何正确分割含单双引号的字符串以完整提取HTML值?
解决包含特殊字符的^分隔键值对字符串分割问题
嘿,我太懂你现在碰到的麻烦了——用普通的split方法处理带单双引号的HTML内容时,job_description的值总是被截断,根本拿不到完整的内容。这是因为简单的split没法智能区分分隔符^到底是键值对之间的分隔,还是值里面的内容(哪怕你的例子里值没包含^,原代码的split('=')也会在值里有=的时候直接炸锅)。
别担心,我们换个思路:用正则表达式精准匹配每个完整的键=值单元,不管值里有单双引号、特殊字符都能完整捕获。下面是修改后的代码:
var string = 'job_category=IT^job_description=<p><span style="font-size: 18px;">Many other html attribute\'s </span></p>^job_type=2^qualification=2^EQ'; function get_json_from_string(x) { var ob = {}; // 正则匹配规则:捕获键名 + 等号 + 完整值(直到下一个^或字符串结束) var keyValueRegex = /([^\^=]+)=([^\^]*)(?=\^|$)/g; let matchResult; // 循环匹配所有键值对 while ((matchResult = keyValueRegex.exec(x)) !== null) { const key = matchResult[1]; const value = matchResult[2]; ob[key] = value; } return ob; } var finalOutput = get_json_from_string(string); console.log(finalOutput.job_description); // 输出完整内容:<p><span style="font-size: 18px;">Many other html attribute's </span></p>
正则规则解释
([^\^=]+):匹配键名,只捕获**不是^和=**的字符,确保不会把值里的内容误当成键的一部分=:精准匹配键和值之间的分隔符([^\^]*):匹配完整的值,捕获直到下一个^或字符串结尾的所有内容,不管里面有单双引号还是其他特殊字符(?=\^|$):正向预查,确保我们匹配的结束位置是下一个^或者字符串末尾,不会多匹配也不会漏内容
为什么原代码会出问题?
原代码先通过split('^')拆分整个字符串,再对每个片段用split('=')拆分键和值。这种方式的致命问题是:如果值里包含=字符(比如HTML属性里的style="width=100px"),split('=')会直接把值拆成多个部分,导致你只能拿到=之前的半截内容。而用正则匹配的方式,就能完美避开这个坑。
内容的提问来源于stack exchange,提问作者Mr world wide
相关产品推荐
相关产品推荐

