提取包含特定子字符串的html属性

时间:2018-06-22 21:01:49

标签: regex

我需要在最里面的引号内匹配一个单词(等等)。示例:

<link rel="stylesheet" type="text/css" href="/BLAH/Test/Test/Test.css"> <script src="/blah/Test/Test/Test.js"></script> 

所以我需要它返回:

“ / BLAH / Test / Test / Test.css”

“ / blah / Test / Test / Test.js”

当我尝试写东西时,它会抓住第一个和最后一个双引号,而不是看到单词blah的两个实例。

任何帮助将不胜感激,但请多解释一下,以便我学习!

3 个答案:

答案 0 :(得分:1)

(<link.*href=['"]([^'"]*).*|<script.*src=['"]([^'"]*).*)

You can see it in action here

所以这是先定位一个链接标签或一个脚本标签。然后,它在链接中查找href属性,或者在脚本中查找src属性。然后,它将捕获该特定属性用引号引起来的所有内容。如果您不使用引号定义属性,这将不起作用

您也可以使用我在评论中建议的lookbehind method,但是我被告知,lookbehinds没有得到广泛支持,所以后果自负。

答案 1 :(得分:1)

您将需要一个类似于正则表达式的贪婪正则表达式,然后在回车标记中进行匹配,然后回溯以尽快找到发生的事件(您应启用不区分大小写的标记i或与[bB][lL][aA][hH]一起使用):

<\w+ [^>]*\w+="([^"]*?blah[^"]*)"

Live demo

正则表达式细目:

  • <\w+匹配标签开头
  • [^>]*匹配除>以外的任何其他字符,零次或多次
  • \w+="匹配="之后的属性名称
  • ( CG#1的开始
    • [^"]*?blah[^"]*匹配双引号中包含单词blah的所有内容
  • ) CG#1结束
  • "匹配"

然后,您需要有权访问第一个捕获组。在像PHP这样的语言中,它将是:

$str = <<<_
<link rel="stylesheet" type="text/css" href="/BLAH/Test/Test/Test.css">
<script src="/blah/Test/Test/Test.js"></script> 
_;

preg_match_all('~<\w+ [^>]*\w+="([^"]*?blah[^"]*)"~i', $str, $matches);
var_dump($matches[1]); // Here we dump captured group one

答案 2 :(得分:0)

如果您使用"(.*)"来匹配例如a="aa" b="bb",您将得到aa" b="bb,因为*是一个贪婪的运算符-例如What do 'lazy' and 'greedy' mean in the context of regular expressions?

您可以使用惰性运算符,例如*?中的"(.*?)"或贪婪的运算符,其表达式将匹配除引号以外的所有内容,例如"([^"]*)"