我需要在最里面的引号内匹配一个单词(等等)。示例:
<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的两个实例。
任何帮助将不胜感激,但请多解释一下,以便我学习!
答案 0 :(得分:1)
(<link.*href=['"]([^'"]*).*|<script.*src=['"]([^'"]*).*)
所以这是先定位一个链接标签或一个脚本标签。然后,它在链接中查找href属性,或者在脚本中查找src属性。然后,它将捕获该特定属性用引号引起来的所有内容。如果您不使用引号定义属性,这将不起作用。
您也可以使用我在评论中建议的lookbehind method,但是我被告知,lookbehinds没有得到广泛支持,所以后果自负。
答案 1 :(得分:1)
您将需要一个类似于正则表达式的贪婪正则表达式,然后在回车标记中进行匹配,然后回溯以尽快找到发生的事件(您应启用不区分大小写的标记i
或与[bB][lL][aA][hH]
一起使用):
<\w+ [^>]*\w+="([^"]*?blah[^"]*)"
正则表达式细目:
<\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?
您可以使用惰性运算符,例如*?
中的"(.*?)"
或贪婪的运算符,其表达式将匹配除引号以外的所有内容,例如"([^"]*)"