当前位置: 首页 > 知识库问答 >
问题:

javascript - 正则如何完整匹配script标签的中间内容?

西门良才
2024-02-21

PHP文件如下:

<script src="static/js/jsencrypt.js?v=<?= WEB_VERSION ?>"></script><script src="static/js/jquery.form.js?v=<?= WEB_VERSION ?>"></script><script type="text/javascript">    var a = 1;    var b = 2;</script>

如何通过正则表达式捕获到script标签中间部分的内容,例如 第三个script标签内容为:

    var a = 1;    var b = 2;

我自己写了的一段正则:/(<script\b[^>]*>)([\s\S]*?)(<\/script>)/gm
这段正则只能匹配script标签属性不插入>的情况,如果script标签属性插入了>就会匹配错误。

共有4个答案

袁智明
2024-02-21

如果是 Javascript 的话,建议使用 DOMParser 解析 html 字符串:

const htmlStr = `<script src="static/js/jsencrypt.js?v=<?= WEB_VERSION ?>"></script><script src="static/js/jquery.form.js?v=<?= WEB_VERSION ?>"></script><script type="text/javascript">    var a = 1;    var b = 2;</script>`;const parser = new DOMParser();console.log(  parser.parseFromString(htmlStr, "text/html")        .querySelectorAll("script")[2]    ?.innerHTML);
    var a = 1;    var b = 2;
齐建安
2024-02-21

一般来说script标签有内容的会标签会有type="text/javascript"那么可以:
(?<=<script.*type="text\/javascript".*>)([\s\S]*?)(?=\<\/script>)

js代码:

const regex = /(?<=<script.*type="text\/javascript".*>)([\s\S]*?)(?=\<\/script>)/gm;const str = `<script src="static/js/jsencrypt.js?v=<?= WEB_VERSION ?>"></script><script src="static/js/jquery.form.js?v=<?= WEB_VERSION ?>"></script><script type="text/javascript">    var a = 1;    var b = 2;</script>`;let m;while ((m = regex.exec(str)) !== null) {    // 必须这样才能在零宽(位置)匹配时避免死循环    if (m.index === regex.lastIndex) {        regex.lastIndex++;    }        // 可以通过变量`m`获取结果    m.forEach((match, groupIndex) => {        console.log(`Found match, group ${groupIndex}: ${match}`);    });}
西门凯康
2024-02-21
/** * 获取html代码中指定标签名的内容 * @param htmlStr html字符串 * @param tagName 标签名称 * @param isGetTagInnerContent 是否只获取标签内部的内容 */function getCodeByTagName (htmlStr, tagName, isGetTagInnerConten) {  let reg = new RegExp(`<${tagName}[^>]*>([\\s\\S]*)<\\/${tagName}>`);  if (isGetTagInnerContent) {    reg = new RegExp(`(?<=<${tagName}[^>]*>)([\\s\\S]*)(?=<\/${tagName}>)`);  }  // console.log('reg', reg);  let matched = htmlStr.match(reg);  return matched ? matched[0] : '';};let str = `<script type="text/javascript">    var a = 1;    var b = 2;</script>`;// 输出:\n    var a = 1;\n    var b = 2;\nconsole.log(getCodeByTagName(str, 'script', true));

image.png

谭安翔
2024-02-21

正则表达式是用来匹配字符串的,而你的问题中,script标签的属性中包含了>,这使得正则表达式无法正确匹配。

你的正则表达式 /<script\b[^>]*>([\s\S]*?)<\/script>/gm 的问题在于它假设script标签的属性中不会包含>,而实际上,你的示例中script标签的属性中就包含了>

一个更好的解决方案是使用DOM解析器来解析HTML,然后提取出script标签的内容。这样可以更准确地处理各种情况,包括属性中包含>的情况。

如果你坚持要使用正则表达式,那么你可能需要一个更复杂的正则表达式,可以处理HTML中的各种情况。这样的正则表达式通常被称为“贪婪”的,并且可能会非常复杂和难以维护。

如果你只是想提取出script标签的内容,我建议你使用DOM解析器。在PHP中,你可以使用DOMDocument类来做到这一点。以下是一个示例:

$dom = new DOMDocument();@$dom->loadHTML($html); // $html 是你的HTML字符串$scripts = $dom->getElementsByTagName('script');foreach ($scripts as $script) {    echo $script->nodeValue . "\n";}

这段代码将遍历所有的script标签,并打印出它们的内容。注意,这只会提取出script标签的文本内容,而不会提取出内嵌的JavaScript代码。如果你需要提取出内嵌的JavaScript代码,你可能需要使用一个更复杂的解析器或工具,例如PHP的tidy扩展或外部的HTML解析库。

 类似资料:
  • 问题内容: 我正在研究一个小的Python脚本来清理HTML文档。它的工作方式是接受KEEP的标签列表,然后解析不在列表中的HTML代码,破坏标签我一直在使用正则表达式来做到这一点,而且我已经能够匹配开始标签和自动关闭标签但不关闭标签。 我一直在尝试匹配结束标记的模式是。在我看来这是合乎逻辑的,所以为什么不起作用?本应匹配任何不是一个锚定标记(不就是“a”是可以anything –这只是一个例子)

  • 问题内容: 这是我的正则表达式,可以很好地匹配字符串中的链接。但是我不希望它选择每个链接。如果链接位于链接之前或之后,则不应对该链接进行数学计算。怎么做到呢? 这些应匹配: 这些不应该匹配: 为什么需要这个?:我希望每个链接都可以单击,即使它不在锚标记之间也是如此。 问题答案: 关于使用正则表达式解析html的所有免责声明,如果您想对这个任务使用正则表达式,则可以使用: 交替匹配的左侧 完成,然后

  • 问题内容: 我想使用正则表达式匹配字符串的一部分,然后访问带括号的子字符串: 我究竟做错了什么? 我发现上面的正则表达式代码没有任何问题:我要针对的实际字符串是: 报告“%A”未定义似乎是一个非常奇怪的行为,但与该问题没有直接关系,因此我打开了一个新的代码, 为什么匹配的子字符串在JavaScript中返回“未定义”? 。 问题在于它的参数就像一条语句一样,并且由于我正在记录的字符串()具有特殊值

  • A well-known tag balancing: searches for tag or tag's content bounds from current caret position and selects it. It will expand (outward balancing) or shrink (inward balancing) selection when called m