function getSrc($content) {
$pattern = '<(?:content|src)="((?:https?://\d+\.media\.tumblr\.com)/(?:\w+)/(?:tumblr_[^_]+_(?:1280|500|400|250)\.(?:png|jpg|gif)))">i';
preg_match($pattern, $content, $matches);
return $matches[1];
}
如果内容按此顺序排列:
...500.jpg...
...1280.jpg...
...400.jpg...
是否有可能使正则表达式更喜欢返回更大的数字?
最后,我改变了拯救生命的代码:
function getSrc($content) {
$pattern = '<(?:content|src)="((?:https?://\d+\.media\.tumblr\.com)/(?:\w+)/(?:tumblr_[^_]+_(1280|500|400|250)\.(?:png|jpg|gif)))">i';
preg_match_all($pattern, $content, $matches);
array_multisort($matches[2], SORT_DESC, $matches[1]);
return $matches[1][0];
}
答案 0 :(得分:1)
是的,但有一个严重的警告:它慢得多,因为它重新扫描每个选项的字符串:
$pattern = '<^(.*(1280)|.*(500)|.*(400)|.*(250))">';
基本上,^
将正则表达式锚定在左侧,然后每个选项都完全匹配。显然,对于长字符串来说,这是非常低效的,但它可以解决问题。
另外,如果它不是它们的功能,我道歉,但我假设正则表达式与1280"
匹配,但如果"
不是意图,那么这似乎是更可取的是:
$pattern = '<^(.*(1280)|.*(500)|.*(400)|.*(250))>';
提取时,请使用组2到5.或者,删除多余的组括号,再与'<(1280|500|400|250)>'
进行匹配以提取值。
注意:此答案中的选项不使用不区分大小写的标记,但是由于正则表达式的其他部分,您可以随时包含它。