【问题标题】:Search on string and capture value of specific HTML attribute搜索字符串并捕获特定 HTML 属性的值
【发布时间】:2017-04-07 13:41:27
【问题描述】:

我需要一个正则表达式来获取所有后续字符串的 src 值,考虑单引号、双引号和无引号。

双引号:

var a = '<script class="anyClass" src="anyFile.js" id="anyID">';
var b = '<script class="anyClass" src="anyFile.js">';
var c = '<script src="anyFile.js" id="anyID">';
var d = '<script src="anyFile.js">';

单引号:

var e = "<script class='anyClass' src='anyFile.js' id='anyID'>";
var f = "<script class='anyClass' src='anyFile.js'>";
var g = "<script src='anyFile.js' id='anyID'>";
var h = "<script src='anyFile.js'>";

不带引号:

var i= "<script class=anyClass src=anyFile.js id=anyID>";
var j= "<script class=anyClass src=anyFile.js>";
var k= "<script src=anyFile.js id=anyID>";
var l= "<script src=anyFile.js>";

预期匹配/返回:

anyFile.js

我有这个看起来很差的拆分解决方案:

var file = "";
var match = 'src="';
if(a.indexOf(match)>=0){
  file = a.split(match);
  file = file[1];
  file = file.split('.js"');
  file = file[0] + ".js";
}
else{
  match = "src='";
  if(a.indexOf(match)>=0){
    file = a.split(match);
    file = file[1];
    file = file.split(".js'");
    file = file[0] + ".js";
  }
  else{
    match = "src=";
    if(a.indexOf(match)>=0){
      file = a.split(match);
      file = file[1];
      file = file.split('.js');
      file = file[0] + ".js";
    }
    else {
    file = "no match";
    }
  }
}

但它可以匹配错误的src 属性,所以我需要一个正则表达式。

任何帮助将不胜感激。

解决方案(特别感谢 Rajesh)

var a = "<script class='anyClass' src='anyFile.js' id='anyID'>";
var b = '<script class="anyClass" src="anyFile.js">';
var c = '<script src="anyFile.js" id="anyID">';
var d = '<script src="anyFile.js">';

var e = "<script class='anyClass' src='anyFile.js' id='anyID'>";
var f = "<script class='anyClass' src='anyFile.js'>";
var g = "<script src='anyFile.js' id='anyID'>";
var h = "<script src='anyFile.js'>";

var i= "<script class=anyClass src=anyFile.js id=anyID>";
var j= "<script class=anyClass src=anyFile.js>";
var k= "<script src=anyFile.js id=anyID>";
var l= "<script src=anyFile.js>";
var l= "<script src=anyFile.js>";

function getSrc(str){
  var regex = /src=["']*[^"' >]+/;
  var match = str.match(regex);
  if(match!==null){
    match = match[0];
    var replaceRegex = /src=["' ]*/;
    match = match.replace(replaceRegex, "")
  }
  else{
    match = "no match";
  }
  console.log(match);
}

[a,b,c,d,e,f,g,h,i,j,k,l].forEach(getSrc)

【问题讨论】:

标签: javascript regex


【解决方案1】:

你可以试试这样的:

逻辑:

  • 搜索模式 src= 后跟单引号/双引号 [可选] 后跟任何非单引号/双引号。
  • 这将产生类似src="anyfile.js 的内容。
  • 现在替换首字母,即src=,后跟可选引号。

正则表达式版本

var a = '<script class="anyClass" src="anyFile.js" id="anyID">';
var b = '<script class="anyClass" src="anyFile.js">';
var c = '<script src="anyFile.js" id="anyID">';
var d = '<script src="anyFile.js">';
var i= "<script class=anyClass src=anyFile.js id=anyID>";
var j= "<script class=anyClass src=anyFile.js>";
var k= "<script src=anyFile.js id=anyID>";
var l= "<script src=anyFile.js>";

function getSrc(str){
  var regex = /src=["']*[^"' >]+/;
  var match = str.match(regex)[0];
  var replaceRegex = /src=["' ]*/;
  match = match.replace(replaceRegex, "")
  console.log(match)
}

[a,b,c,d,i,j,k,l].forEach(getSrc)

【讨论】:

  • 我觉得你有点复杂了,这怎么比我的回答好?
  • ('|"){0,1} == ['"]?
  • 嗨@Rajesh,感谢您的帮助:) 您的解决方案几乎就在那里,但它与 i,j,k,l 字符串不匹配。有什么建议吗?
  • Rajesh 没问题,再次感谢,祝您旅途愉快。
  • 感谢@Rajesh,它正在工作。如果 str.match(regex) 返回 null(未找到匹配项),我只是进行了修改以避免 JS 错误。我将结果作为我的问题的更新。
【解决方案2】:

这是我想出的实现这一目标的方法。欢迎任何改进:

script src=["']?(\w+\.js)

https://regex101.com/r/6NCj94/2

或者对于脚本名称类似于 jquery.min.js 的情况:

script src=["']?(.*\.js)

https://regex101.com/r/6NCj94/3

【讨论】:

  • 虽然对于上面提到的情况,它工作正常,但如果你有多个.,比如fileName.min.js,或者像fileName.askcf123.js这样有散列,它就会失败
  • 那么你可以简单地使用.*而不是\w+。
  • 嗨 ThePerplexedOne,感谢您的帮助。在 regex101.com 上,当我选择 Javascript 作为 Flavor 时,它匹配脚本 src=anyFile.js,而不仅仅是 anyFile.js。但是您的解决方案是使用 PHP 作为 Flavor,我需要修改什么?
  • 我明白你的意思,但请放心,没有什么不同。它仍然匹配,向右看,您会看到 Match Information 和 Groups。这些组是我们想要的,这是我们正在捕获的。这个正则表达式可以正常工作。 @EduardoSR
  • 感谢 ThePerplexedOne,对不起我的错误。我发现它也有效。
【解决方案3】:

我更喜欢正确的方式,使用 DOM:

var scripts = document.getElementsByTagName('script');
Array.prototype.forEach.call(scripts, (script => console.log(script.src)));

完整的javascript代码:

var a = '<script src="anyFile1.js"><\/script>';
var b = '<script src=\'anyFile2.js\'><\/script>';
var c = '<script src=anyFile3.js><\/script>';

var html = document.createElement('div');
html.innerHTML = a + b + c;

var scripts = html.getElementsByTagName('script');
[].forEach.call(scripts, (script => console.log(script.src)));

正则表达式方式

<script[^>]+?src=(['"]?)([^\s>]+)\1[^>]*>(<\/script>)?

Live demo

str.replace(/<script[^>]+?src=(['"]?)([^\s>]+)\1[^>]*>(<\/script>)?/g, (
    (match, $0, $1) => $1 ? array.push($1) : ''
))

完整的JS代码:

const str = `<script class="anyClass" src="anyFile.js" id="anyID">
<script class="anyClass" src="anyFile.js">
<script src="anyFile.js" id="anyID">
<script src="anyFile.js">


<script class='anyClass' src='anyFile.js' id='anyID'>
<script class='anyClass' src='anyFile.js'
<script src='anyFile.js' id='anyID'>
<script src='anyFile.js'>

<script class=anyClass src=anyFile.js id=anyID>
<script class=anyClass src=anyFile.js>
<script src=anyFile.js id=anyID>
<script src=anyFile.js >`;

var array = [];

str.replace(/<script[^>]+?src=(['"]?)([^\s>]+)\1[^>]*>(<\/script>)?/g, (
    (match, $0, $1) => $1 ? array.push($1) : ''
))

console.log(array)

【讨论】:

  • 感谢@revo,您的解决方案很棒。如果我找不到正则表达式,我会使用它。
  • 但这不是一个好主意,我也添加了一个基于正则表达式的解决方案。请检查一下。
  • 你可以用Array.from代替[].forEach.call
猜你喜欢
  • 2018-06-24
  • 1970-01-01
  • 2018-01-10
  • 1970-01-01
  • 1970-01-01
  • 2012-10-30
  • 1970-01-01
  • 2023-03-07
  • 2021-12-02
相关资源
最近更新 更多