0

很难将所有内容都放在问题的标题中,因为它具体取决于人们想要拆分的字符串。但这里是:

我有一个字符串,其中有多个脚本标签:

<script type="text/javascript" src="/javascripts/something-1.js"></script>
<script type="text/javascript" src="/javascripts/something-2.js"/>
<script type="text/javascript" src="/javascripts/something-3.js"></script>
<link rel="stylesheet" type="text/css" href="/something-1.css">

我想将此字符串拆分为多个字符串,每个字符串都包含一个脚本标签(忽略链接标签)。我是这样做的:

var scripts = code.match(/<script.*src=.*(\/>|<\/script>)/g);

这是为了将脚本标签与结束标签匹配/>或匹配</script>。但是,使用这个当前的正则表达式,我总是得到:

<script type="text/javascript" src="/javascripts/something-1.js"></script>
<script type="text/javascript" src="/javascripts/something-2.js"/>

作为一个字符串 - 不是两个。

我如何正则表达式:

/<script.*src=( (not script not link) /> | (not link) <\/script> )/g
4

4 回答 4

2

一般来说,您尝试做的事情是不可能的。但是,如果您可以对源字符串做出某些简化假设,则可以创建一个足够好的正则表达式。这是我会尝试的:

/<script(?:\s+\w+\s*=\s*"[^"]*")+\s*/?>(?:</script>)?/gi

解释:

  • <script匹配开始标签的开头。

  • (?:\s+\w+\s*=\s*"[^"]*")+消耗一个或多个属性

  • \s*/?>匹配开始标签的结尾。如果它是一个自闭合标签,则/?消耗斜线。

  • \s*(?:</script>)?否则,这匹配结束标记。

基本思想是用与开始标签末尾.*不匹配的东西替换>,因此“转义”以匹配比你想要的更多的东西。当然,没有任何保证。我什至不知道您的 HTML 是否有效,即使在有效的 HTML 中,也有很多方法可以欺骗此正则表达式。

于 2012-04-25T01:51:05.917 回答
2

改为尽可能少而不是尽可能多地匹配.*.*?

于 2012-04-24T23:24:33.763 回答
2

另一种处理方法是通过使用 xmldom 将“src”用作“脚本”标签的属性,并将页面作为部分或完整的 xml 文档。这是抓住它们并避免链接的积极方式。

于 2012-04-24T23:33:07.750 回答
1

我会使用类似的东西

var rx = /<script.+?src=.+?\/(script)?>/gim;

这将匹配任何内容:

  • 从...开始<script
  • 至少还有 1 个字符(可以是空格,例如,或其他一些属性值对)
  • src=
  • 至少还有 1 个字符
  • 然后要么/>/script>

还有旗帜……</p>

  • i标志用于不区分大小写
  • g标志用于多个匹配项
  • m标志用于多行源(假设这些行实际上是行本身,而不是总共一行)

编辑:我没有考虑到在src属性&src=etc值中的地址中具有 get 值的可能性。

于 2012-04-25T00:41:55.117 回答