JS正则表达式的方法 js正则表达式\d

论文研究探讨了javascript `window.getselection()` api在处理复杂字符串(如url)时,`modify('word')`方法的局限性。针对该问题,提出了一种自定义的解决方案,通过迭代式地扩展选区并结合正则表达式检测空格或换行符,实现对文本的准确选择,确保完整捕获特定格式的内容,弥补了中间api的不足。引言:selection.modify('word')的局限性
在Web中,window.getSelection()开发API为我们提供了强大的文本选择和操作能力。其中,selection.modify()方法允许我们以编程方式调整当前选区。例如,selection.modify('move','backward','word')和selection.modify('extend','forward','word') 可以将选区移动或扩展一个“单词”的范围。
但是,对于“单词”的定义,浏览器有其默认的实现逻辑。在某些特定场景下,这种默认逻辑可能无法满足我们的需求。例如,当文本内容是一个完整的URL(如https://www.youtube.com/watch?v=vEQ8CXFWLZU)时,如果查看位于URL内部,使用modify('word')可能会导致只选择 URL 的一部分,而不是整个 URL。这是因为浏览器可能会将 URL 中的某些特殊字符(如 /, =, ? 等)视为单词边界,从而打断了选择。
我们的目标是实现一种更精确的文本选择机制:无论是位置定位哪里,只要它在一个连续的非式空格/非行符序列中,我们就希望能够选择从前一个空格/换行符到后一个空格/换行符之间的所有内容,从而完整地找到像URL这样的“词法单元”。核心原理:迭代扩展与边界检测
归因于selection.modify()该方法不提供直接划分“前一个/后一个空格或换行符”的类型,需要我们一种自定义的解决方案。核心思想是:手动控制选区的起始点(anchorNode,anchorOffset)和结束点(focusNode,focusOffset),通过并逐字符移动并结合正则表达式来检测边界。
立即学习“Java免费学习笔记(深入)”;
keyAPI是selection.setBaseAndExtent(anchorNode,锚点偏移,焦点节点,这个方法允许我们精确地设置选区的起始偏移量、起始偏移量、结束节点和偏移结束量。通过循环迭代地调整这些偏移量,我们可以在字符级别上控制选区。
边界检测是实现此功能的关键。利用selection.toString().search(/\r?\n| /)来判断当前选区的内容是否包含回车符、换行符或空格。如果包含,则意味着我们已经越过目标边界,需要将偏移量调整回前一个位置。
微软文字转语音
微软文本转语音,支持选择多种语音风格,可调节语速。0查看详情实现步骤与代码示例
以下是实现这一自定义文本选择策略的详细步骤和相应的代码示例。HTML结构
首先,我们需要一个包含测试和文本触发选择操作按钮的HTML页面。lt;!DOCTYPE htmlgt;lt;html lang=quot;zh-CNquot;gt;lt;headgt; lt;元字符集=quot;UTF-8quot;gt;lt;titlegt;自定义文本选择示例lt;/titlegt; lt;脚本 src=quot;https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.jsquot;gt;lt;/scriptgt; lt;stylegt; body { font-family:无衬线; 行高: 1.6; } pre { 背景颜色: #f4f4f4; padding: 10px; 边框半径: 5px; } 按钮 { padding: 8px 15px; 背景颜色: #007bff; 颜色:白色; 边框: none; 边框半径: 4px; 光标: 指针; } 按钮:悬停 { 背景颜色: #0056b3; } lt;/stylegt;lt;/headgt;lt;bodygt; lt;h1gt;准确的文本选择练习lt;/h1gt;lt;pgt;确认出现以下任意一个YouTube URL内部,然后点击按钮。
lt;/pgt; lt;pregt;https://www.youtube.com/watch?v=vEQ8CXFWLZU https://www.youtube.com/watch?v=vEQ8CXFWLZUlorem ipsum https://www.youtube.com/watch?v=vEQ8CXFWLZU https://www.youtube.com/watch?v=vEQ8CXFWLZU lorem ipsum https://www.youtube.com/watch?v=vEQ8CXFWLZU lorem ipsum lt;/pregt; lt;buttongt;点击选择lt;/buttongt; lt;scriptgt; // JavaScript 代码将放在这里 lt;/scriptgt;lt;/bodygt;lt;/htmlgt;登录后复制 JavaScript逻辑框图
当用户点击按钮时,我们将执行以下逻辑:
获取当前选区:const Selection = window.getSelection();获取当前的Selection对象。
初始化选区信息:获取选区的anchorNode(初始节点)、anchorOffset(初始偏移量)、focusNode(节点结束)和focusOffset(结束偏移量)。为了简化处理,我们首先对这些值进行排序,确保bo(base offset)始终小于ao(anchor offset)。let [bws,aws] = [false,false]; // bws: 后向空间找到, aws: 前向空间 findlet [ [bn, bo], // bn: baseNode, bo: baseOffset [an, ao] // an:anchorNode, ao:anchorOffset] = [ [selection.anchorNode, Selection.anchorOffset], [selection.focusNode, Selection.focusOffset]].sort(function(aa, bb) { // 保证 bo 总是小于 ao,简化后续的扩展逻辑 return AA[1] - bb[1];});登录后复制
连续扩展(寻找前一个边界):从当前光标位置开始,逐字符向文本起始方向扩展选区,直到遇到空格或换行符。while (!bws amp;amp; 0 lt; bo) { Selection.setBaseAndExtent(bn, --bo, an, ao); // 尝试将起始点前移模型 if ((bws = (-1 !==) Selection.toString().search(/\r?\n| /)))) { bo; //如果新选区包含了边界字符,说明前移了一个目标界了,所以将起始点恢复 }}登录后复制
向前扩展(寻找下一个边界):从当前屏幕位置开始,逐字符向文本结尾方向扩展选区,直到遇到空格或换行符。
while (!aws amp;amp; an.length gt;= ao 1) { Selection.setBaseAndExtent(bn, bo, an, ao); // 尝试将结束点后移模型 if ((aws = (-1 !== Selection.toString().search(/\r?\n| /)))) { --ao; // 如果新选区包含了边界字符,说明后移了模型,所以将结束点}}登录后复制
最终确定选区输出并:在找到精确的边界后,使用setBaseAndExtent最终设置选区,把内容打印到控制台。selection.setBaseAndExtent(bn, bo, an, ao); // 设定的精确选区console.log(selection.toString()); // 打印内容选区登录后复制完整代码示例
将上述JavaScript逻辑集成到其HTML文件的lt;scriptgt;标签中:lt;!DOCTYPE htmlgt;lt;html lang=quot;zh-CNquot;gt;lt;headgt; lt;meta charset=quot;UTF-8quot;gt; lt;titlegt;自定义文本选择示例lt;/titlegt; lt;script src=quot;https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.jsquot;gt;lt;/scriptgt; lt;stylegt; body { font-family: sans-serif; line-height: 1.6; } pre { background-color: #f4f4f4; padding: 10px; border-radius: 5px; } button { padding: 8px 15px; background-color: #007bff; color: white; border: none; border-radius: 4px; cursor: pointer; } button:hover { background-color: #0056b3; } lt;/stylegt;lt;/headgt;lt;bodygt;lt;h1gt;准确选择文本练习lt;/h1gt;lt;pgt;皮肤提示出现以下任何一个YouTube URL内部,然后点击按钮。
lt;/pgt; lt;pregt;https://www.youtube.com/watch?v=vEQ8CXFWLZU https://www.youtube.com/watch?v=vEQ8CXFWLZUlorem ipsum https://www.youtube.com/watch?v=vEQ8CXFWLZU https://www.youtube.com/watch?v=vEQ8CXFWLZU lorem ipsum https://www.youtube.com/watch?v=vEQ8CXFWLZU lorem ipsum lt;/pregt; lt;buttongt;点击选择lt;/buttongt; lt;scriptgt; $('button').on('click', function() { const Selection = window.getSelection(); let [bws, aws] = [false, false]; // bws: 找到向后空格, aws: 找到前向空间 let [ [bn, bo], // bn:baseNode, bo:baseOffset [an,ao] // an:anchorNode,ao:anchorOffset ] = [ [selection.anchorNode,selection.anchorOffset],[selection.focusNode,selection.focusOffset] ].sort(function(aa, bb) { //确定 bo (baseOffset) 总是小于 ao (anchorOffset) //这有助于统一处理选区是从到右还是从右到左选择的情况 return aa[1] - bb[1]; }); // 稀疏扩展选区,直到遇到空格或换行符 // 循环条件: // 1. !bws:尚未找到后向边界 // 2. 0 lt; bo: 偏移量大于0,即还有字符平滑可以移动 while (!bws amp;amp; 0 lt; bo) { //尝试将选择区的起始点 (bo) 向前移动一个字符选择.setBaseAndExtent(bn, --bo, an, ao); // 检查当前选区内容是否包含空格或换行符 if ((bws = (-1 !== Selection.toString().search(/\r?\n| /)))) { // 如果包含了边界字符,说明前面的前移操作已经越过 // 所以将起始点 (bo)
恢复到上一个有效位置 bo; } } // 向前延伸选区,直到遇到空格或换行符 // 循环条件: // 1. !aws:尚未找到前向边界 // 2. an.length gt;= ao 1:偏移量小于文本节点长度,即还有字符可以向前移动 while (!aws amp;amp; an.length gt;= ao 1) { // 尝试将选区的结束点 (ao) 移动一个字符Selection.setBaseAndExtent(bn, bo, an, ao); // 检查当前选区换内容是否包含空格或行符 if ((aws = (-1 !== Selection.toString().search(/\r?\n| /)))) { // 如果包含了边界字符,说明上一步的后移操作已经越过边界 // 将结束点 (ao) 恢复到上一个有效位置 --ao; } } // 根据最终确定的起始点 (bn, bo)和结束点 (an, ao) 设置选区selection.setBaseAndExtent(bn, bo, an, ao); // 将最终选区的内容输出到控制台 console.log(selection.toString()); }); lt;/scriptgt;lt;/bodygt;lt;/htmlgt;登录后复制注意事项与进阶考量兼容性: window.getSelection() API在所有现代浏览器中都得到了广泛的支持,因此该解决方案具有良好的兼容性。 性能:这种字符逐迭代和正则表达式匹配的方法在处理非常长的文本时可能会有一定的性能开销。然而,对于处理单个URL或等常见场景,性能是完全可以接受的。边界条件:代码已考虑了文本开头(0 lt;bo)和结尾(an.length gt;= ao 1)的边界块情况,保证不会出现越界错误。则其正表达式的整数:/\r?\n| /这个正则表达式可以根据具体需求进行修改。例如,如果需要将选区删除逗号、句号或其他特定符号,只需对应地调整正则表达式即可。多节点选择:本示例主要针对位于单个文本节点内部的情况。如果选区覆盖了多个文本节点或HTML元素(例如,在一个内部有多个lt;divgt;pgt;标签),则需要更复杂的逻辑来方便和处理不同的节点,这超出了本教程的范围。用户体验:在实际应用中,可以考虑在选区变化时添加视觉反馈,例如高亮显示选中的文本,以提升用户体验。总结
通过上述自定义的JavaScript逻辑,我们成功地克服了selection.modify('word')在处理复杂字符串(如URL)时的局限性。
迭代式地扩展选区并结合正则表达式进行这样的边界检测的方法,为Web提供了更加精确和灵活的文本选择能力。它在需要精确解析和操作特定格式文本的场景中,如丰富的文本编辑器、链接工具或代码高亮器等,具有重要的实用价值。
以上就是JavaScript中基于正则表达式的精确文本选择:扩展至空格或换行符边界的内容详细,更多请关注乐哥常识网其他相关文章! java jquery html js ajax node 正则表达式 seo 浏览器 JavaScript 正则表达式 html const 字符串循环长度对象 https word
