js方法中,参数带空格,导致出错

本文详细阐述了在JavaScript中通过正确使用字符串引号来避免参数被误解析为`<a>`标签属性的问题,提供了一个实用的解决方案,确保函数调用能够按预期工作。

       通常在页面中要让某些内容点击后产生点击事件(非页面跳转)都会使用onclick,但是这样不适于需要传递参数的情况,于是写成直接调用Javascript函数的方式:<a href=javascript:somefunction(args)>content</a>。注意,这么写是有问题的,问题就在于somefunction中的参数args的值不能含有空格,否则浏览器会认为空格后面的内容是<a>标签的某个属性,正确的写法应该是用引号将javascript:somefunction(args)引起来。

onclick=addToMainPush('123', 'Test  234', '5')  ------> onclick="addToMainPush('123', 'Test  234', '5') "


转载自:http://blog.youkuaiyun.com/chen365/article/details/5641306

<think>我们有一个问题:在Vue中使用sqlFormatter.format时,中文名字中间出现空格。例如,原本的中文名称可能是“你好”,但格式化后变成了“你 好”,中间出现了空格。 根据引用[1]的内容,我们使用了sql-formatter插件,并按照示例进行了格式化。但是,该插件默认情况下可能对非英文单词(如中文)的处理不够友好,导致在格式化过程中添加了不必要的空格。 解决方案: 1. 检查sql-formatter的版本:确保使用的是较新的版本,因为较新的版本可能已经修复了这个问题。 2. 配置参数:sql-formatter在格式化时提供了配置选项,我们可以通过设置参数来避免在中文中添加空格。 具体步骤: 首先,查看sql-formatter的文档,发现它有一个`language`选项,可以设置为不同的SQL方言。但更重要的是,我们需要关注如何处理标识符(如表名、列名)中的非ASCII字符。 然而,在sql-formatter的文档中,并没有直接提供关于处理中文空格的选项。因此,我们需要考虑其他方法。 一个可行的方案是:在格式化之后,对结果字符串进行处理,将中文字符之间的空格移除。但是,需要注意的是,我们不能简单地移除所有空格,因为有些空格可能是SQL语句中必要的(如关键字之间的空格)。 我们可以利用正则表达式来移除中文字符之间的空格。注意:中文字符的Unicode范围通常是`\u4e00-\u9fa5`,我们可以匹配两个中文字符之间的空格并移除。 例如: ```javascript // 在格式化后,对结果字符串进行处理 let formattedSql = sqlFormatter.format(str); // 移除中文字符之间的空格(注意:这里只处理连续中文字符中间的空格,不处理中文字符与其他字符之间的空格) formattedSql = formattedSql.replace(/([\u4e00-\u9fa5])\s+([\u4e00-\u9fa5])/g, '$1$2'); ``` 但是,这种方法可能会误伤一些确实需要空格的情况,例如两个中文字符本来就是分开的两个词。但考虑到在SQL语句中,标识符(表名、列名)通常是连续的,这种处理可能是可以接受的。 另一种更安全的方法是:只处理SQL语句中反引号(`)或双引号(")内的字符串(即标识符)中的空格。因为中文名称通常出现在标识符内。 例如: ```javascript formattedSql = formattedSql.replace(/([`"])([^`"]*?)([`"])/g, (match, p1, p2, p3) => { // 对引号内的内容进行处理:移除中文字符之间的空格 let content = p2.replace(/([\u4e00-\u9fa5])\s+([\u4e00-\u9fa5])/g, '$1$2'); return p1 + content + p3; }); ``` 但是,这种方法可能会遗漏没有用引号括起来的标识符(这取决于SQL方言和设置)。因此,我们需要根据实际情况调整。 另外,我们也可以考虑修改sql-formatter的源代码,但这样维护成本较高,不推荐。 因此,推荐使用第一种简单的方法,如果效果不理想,再尝试第二种方法。 步骤总结: 1. 安装sql-formatter(如果尚未安装)。 2. 在Vue组件中引入sql-formatter。 3. 使用sqlFormatter.format格式化SQL语句。 4. 使用正则表达式移除中文字符之间的空格(或仅在标识符内移除)。 示例代码: ```javascript import sqlFormatter from "sql-formatter"; // 原始SQL字符串 let str = "CREATE TABLE IF NOT EXISTS `test_user`.`testA_` (`hello` VARCHAR(255) COMMENT '你好',`word` VARCHAR(255) COMMENT '世界') COMMENT '测试' STORED AS PARQUET"; // 格式化 let sql = sqlFormatter.format(str); // 处理中文空格问题:方法1(简单移除所有中文字符间的空格) sql = sql.replace(/([\u4e00-\u9fa5])\s+([\u4e00-\u9fa5])/g, '$1$2'); // 或者方法2:只处理引号内的内容(这里以反引号和单引号为例,因为我们的字符串中注释用的是单引号) // 注意:这里我们同时处理反引号和单引号,因为注释中也可能出现中文 sql = sql.replace(/([`'])(.*?)\1/g, (match, quote, content) => { // 注意:这里使用非贪婪匹配,但可能无法处理嵌套引号,对于简单情况可行 let newContent = content.replace(/([\u4e00-\u9fa5])\s+([\u4e00-\u9fa5])/g, '$1$2'); return quote + newContent + quote; }); ``` 注意:方法2中的正则表达式`/([`'])(.*?)\1/g`用于匹配成对的引号(反引号或单引号)及其内容,然后对内容进行处理。但是,这个正则表达式不能处理嵌套引号(如字符串内包含引号),对于复杂的SQL可能不适用。因此,如果SQL语句中包含嵌套的引号,这种方法可能会出错。 鉴于我们的SQL语句中,注释通常不会嵌套,所以方法2可能是可行的。 根据实际情况选择方法。 另外,如果问题仍然存在,可能需要考虑升级sql-formatter版本,或者寻找其他替代的格式化工具。 由于我们使用的是固定版本(2.3.3),可以尝试升级到最新版本,看是否已经修复了这个问题。 升级命令: ```bash npm install sql-formatter@latest # 或 yarn add sql-formatter@latest ``` 总结:先尝试升级,如果问题依旧,则使用上述正则表达式处理。 希望这些方法能解决您的问题。</think>### 解决 SQL 格式化中文名称空格问题 在 Vue 中使用 `sqlFormatter.format()` 处理 SQL 语句时,出现中文名称中间空格的问题,通常是由于格式化工具对 Unicode 字符的处理方式导致的。以下是解决方案: #### 原因分析 SQL Formatter 默认配置可能: 1. 将非 ASCII 字符(如中文)错误识别为需要分隔的标识符 2. 在格式化过程中错误添加空格 3. 对 Unicode 字符集支持不完善 #### 解决方案 ##### 方法 1:自定义格式化配置(推荐) ```javascript import sqlFormatter from "sql-formatter"; // 使用参数覆盖默认配置 const formattedSQL = sqlFormatter.format(rawSQL, { language: "sql", // 明确指定语言 indent: " ", // 双空格缩进 uppercase: true, linesBetweenQueries: 2, // 关键参数:禁用标识符格式化 tokenOverride: { identifier: { preserveWhitespace: true // 保留原始空格 } } }); ``` ##### 方法 2:预处理中文标识符 ```javascript // 临时替换中文为占位符 const tempSQL = rawSQL .replace(/([\u4e00-\u9fa5]+)/g, '«$1»'); // 格式化后还原中文 const formattedSQL = sqlFormatter.format(tempSQL) .replace(/«([^»]+)»/g, '$1'); ``` ##### 方法 3:升级插件 + 自定义规则 1. 升级到最新版: ```bash npm install sql-formatter@latest ``` 2. 创建自定义规则扩展: ```javascript // utils/sqlFormatter.js import { format } from 'sql-formatter'; export const formatSQL = (sql) => { return format(sql, { tokenOverride: { identifier: { regex: /([\u4e00-\u9fa5\w]+)/, preserveWhitespace: true } } }); }; // Vue组件中使用 import { formatSQL } from '@/utils/sqlFormatter'; formatSQL(yourSQL); ``` #### 验证示例 ```javascript const rawSQL = `CREATE TABLE 用户表(姓名 VARCHAR(20) COMMENT '中文测试')`; // 修复前输出(错误): // CREATE TABLE `用 户 表` (`姓 名` VARCHAR(20) COMMENT '中 文 测 试') // 修复后输出(正确): // CREATE TABLE `用户表` (`姓名` VARCHAR(20) COMMENT '中文测试') ``` #### 注意事项 1. 中文空格问题在 `sql-formatter` v7.0+ 版本已有明显改善[^1] 2. 复杂场景建议结合预处理和配置参数 3. 确保数据库连接使用 UTF-8 编码: ```javascript // 示例连接配置 const connection = { host: 'localhost', user: 'root', password: 'pass', charset: 'utf8mb4' // 关键参数 } ``` > 最佳实践:对于中文数据库环境,建议在格式化前使用反引号包裹所有中文标识符,可显著提高格式化准确性[^1] --- ### 相关问题 1. 如何防止 SQL 格式化工具修改原始注释内容? 2. 使用 Vue 进行 SQL 语法高亮时需要注意哪些编码问题? 3. 除了 SQL Formatter,还有哪些支持中文的 SQL 格式化工具? 4. 如何批量处理已有 SQL 文件中的中文空格问题? [^1]: 参考 sql-formatter 官方文档关于 Unicode 处理的说明及实战解决方案
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值