正则表达式-如何查找未包含在html标记中或它们之间的单词

如何解决正则表达式-如何查找未包含在html标记中或它们之间的单词

|| 我想在html字符串中找到匹配项。 那不会在html标记之间或它们内部。 例如: 这个词是:
ue
<span color=blue>ue</span>ue<span>sdfsd</span>
所以我只想找到第三个匹配项(不在\“ blue \”内部),而不是在
span
标记之间。 谢谢     

解决方法

        您正在尝试使用正则表达式来解析HTML。 HTML本身无法使用正则表达式轻松,可靠地进行处理。 如果您是在浏览器上执行此操作,则可以改用浏览器的高度优化的HTML解析器。 如果您想在中间有一个标签(例如\“ u
e \”)时检测到该单词,请执行以下操作:
var element,node,topLevelText;
element = document.createElement(\'div\');
element.innerHTML = \"<span color=blue>ue</span>ue<span>sdfsd</span>\";
topLevelText = \"\";
for (node = element.firstChild; node; node = node.nextSibling) {
    if (node.nodeType === 3) { // 3 = text node
        topLevelText += node.nodeValue;
    }
}
if (topLevelText.indexOf(word) >= 0) {
    // Found
}
如果您只想在事物之间检测到它(因此,您的示例而不是\“ u
e \”):
var element,node;
element = document.createElement(\'div\');
element.innerHTML = \"<span color=blue>ue</span>ue<span>sdfsd</span>\";
for (node = element.firstChild; node; node = node.nextSibling) {
    if (node.nodeType === 3) { // 3 = text node
        if (node.nodeValue.indexOf(word) >= 0) {
            // Found
        }
    }
}
(两者都区分大小写。) 就是这样 使用
document.createElement
创建不会在任何地方显示的元素。 通过将HTML文本分配给元素上的
innerHTML
来解析HTML文本。该属性直到最近才被标准化,但是十年来,所有主流浏览器都支持该属性。 浏览该节点的直接子节点,该子节点将包含通过解析创建的所有元素,以及字符串中顶级文本(例如,您要搜索的地方的文本)的文本节点。这是使用
Node#firstChild
Node#nodeType
Node#nodeValue
Node#nextSibling
。 根据您是否要在“ u
e \”情况下找到它,它要么直接查看每个文本节点中的文本,要么将它们全部构建为一个字符串,然后进行搜索。 上面的链接主要针对DOM2 Core规范,大多数浏览器都支持其中的大多数规范。其他方便的参考资料: DOM2 HTML规范(HTML特定的DOM内容) DOM3核心规范(更新的DOM内容)     ,        假设您要处理的是HTML片段(而不是完整的文档),则可以编写一个正则表达式以匹配格式最完整的内部非嵌套元素,然后递归应用此正则表达式删除所有标记的材料,从而保留标签之间剩余的所需非标签材料。这就是这样的正则表达式(以注释的PHP / PCRE \'x \'语法),与大多数空和非空,非嵌套,非短标签HTML元素匹配。
$re_html = \'%# Match non-nested,non-shorttag HTML empty and non-empty elements.
    <                    # Opening tag opening \"<\" delimiter.
    (\\w+)\\b              # $1: Tag name.
    (?:                  # Non-capture group for optional attribute(s).
      \\s+                # Attributes must be separated by whitespace.
      [\\w\\-.:]+          # Attribute name is required for attr=value pair.
      (?:                # Non-capture group for optional attribute value.
        \\s*=\\s*          # Name and value separated by \"=\" and optional ws.
        (?:              # Non-capture group for attrib value alternatives.
          \"[^\"]*\"        # Double quoted string.
        | \\\'[^\\\']*\\\'     # Single quoted string.
        | [\\w\\-.:]+\\b    # Non-quoted attrib value can be A-Z0-9-._:
        )                # End of attribute value alternatives.
      )?                 # Attribute value is optional.
    )*                   # Allow zero or more attribute=value pairs
    \\s*                  # Whitespace is allowed before closing delimiter.
    (?:                  # This element is either empty or has close tag.
      />                 # Is either an empty tag having no contents,| >                  # or has both opening and closing tags.
      (                  # $2: Tag contents.
        [^<]*            # Everything up to next tag. (normal*)
        (?:              # We found a tag (open or close).
          (?!</?\\1\\b) <  # Not us? Match the \"<\". (special)
          [^<]*          # More of everything up to next tag. (normal*)
        )*               # Unroll-the-loop. (special normal*)*
      )                  # End $2. Tag contents.
      </\\1\\s*>           # Closing tag.
    )
    %x\';
这是Javascript语法中的同一个正则表达式:
var re_html = /<(\\w+)\\b(?:\\s+[\\w\\-.:]+(?:\\s*=\\s*(?:\"[^\"]*\"|\'[^\']*\'|[\\w\\-.:]+\\b))?)*\\s*(?:\\/>|>([^<]*(?:(?!<\\/?\\1\\b)<[^<]*)*)<\\/\\1\\s*>)/;
以下javascript函数剥离HTML元素,从而在标签之间保留所需的文本:
// Strip HTML elements.
function strip_html_elements(text) {
    // Match non-nested,non-shorttag HTML empty and non-empty elements.
    var re = /<(\\w+)\\b(?:\\s+[\\w\\-.:]+(?:\\s*=\\s*(?:\"[^\"]*\"|\'[^\']*\'|[\\w\\-.:]+\\b))?)*\\s*(?:\\/>|>([^<]*(?:(?!<\\/?\\1\\b)<[^<]*)*)<\\/\\1\\s*>)/g;
    // Loop removing innermost HTML elements from inside out.
    while (text.search(re) !== -1) {
        text = text.replace(re,\'\');
    }
    return text;
}
此正则表达式解决方案不是正确的解析器,仅处理仅包含html元素的简单HTML片段。它不能(也不能)正确处理具有注释,CDATA节和doctype语句之类的更复杂的标记。它不会删除缺少其可选的close标签的元素(即
<p>
<li>
元素。)     ,        HTML不是一种常规语言,因此无法通过正则表达式进行解析。     ,        由于您在浏览器中具有出色的DOM操作可能性,因此可以利用它。您可以创建一个新元素,将字符串设置为content并遍历所有文本节点:
var tmp = document.createElement(\'div\');
tmp.innerHTML = htmlString;

var matches = [],children = tmp.childNodes,word = \' \' + word + \' \';

for(var i = children.length; i--; ) {
    node = children[i];
    if(node.nodeType === 3 && (\' \' + node.nodeValue + \' \').indexOf(word) > -1) {
        matches.push(node);
    }
}
    

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 &lt;select id=&quot;xxx&quot;&gt; SELECT di.id, di.name, di.work_type, di.updated... &lt;where&gt; &lt;if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 &lt;property name=&quot;dynamic.classpath&quot; value=&quot;tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-