【发布时间】:2011-01-20 21:57:13
【问题描述】:
假设我们有一个字符串:<img src="/a.jpg"> - 如何提取/a.jpg?
那个肯定是错的:#<img src="(.*)[^"]">#
【问题讨论】:
假设我们有一个字符串:<img src="/a.jpg"> - 如何提取/a.jpg?
那个肯定是错的:#<img src="(.*)[^"]">#
【问题讨论】:
这应该可以工作
/<img\s+src="(.*?)"/
【讨论】:
这行得通(尝试在这里测试http://www.spaweditor.com/scripts/regex/index.php)
/".*[^"]/
【讨论】:
/<img src="([^"]*)">/ 有效。
【讨论】:
也许你认为 ^" 的方向是正确的:
<img +src="([^"]+)">
【讨论】:
#<img src="(.*)[^"]"># // original
这几乎是在正确的轨道上。然而,它结合了两种不同的方法。
(.*) 太贪心了。您需要添加? 以使其提前停止。 (.*?) 否则它会占用引号。
那时[^"] 是多余的。但是,您可以将其用作非特定 .* 的替代品。只需将其嵌入大括号中即可。它具有永远不会意外匹配封闭引号的优点。你可以做同样的事情来代替空格,让整个正则表达式更有弹性,并省略结束 > 所以当存在额外属性时它也可以工作:
#<img[^>]+src="([^"]*)"#
这是可以使用正则表达式的少数情况之一。如果你想匹配更复杂的 HTML,那么更喜欢proper parser(phpQuery 或 QueryPath 大大简化了它。)
【讨论】:
只有当 src 是 img 标签将具有的 only 属性并且它始终是第一个时,其他答案才有效。
if (preg_match('/<img\s+(?:\w+="[^"]+"\s*)*?src="([^"]+)/', $input, $matches))
$src = $matches[1];
【讨论】: