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...
$matches[1] 将是 500,因为 500 在 1280 之前出现,但如果有的话,我希望 1280。
是否有可能使正则表达式更喜欢返回更大的数字?
最后,我更改了我的代码以挽救生命:
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];
}
是的,但有一个严重的警告:它要慢得多,因为它为每个选项重新扫描字符串:
$pattern = '<^(.*(1280)|.*(500)|.*(400)|.*(250))">';
基本上,^
将正则表达式锚定在左侧,然后每个选项都完全匹配。显然,这对于长字符串来说效率非常低,但它确实可以解决问题。
另外,如果这不是它们的功能,我深表歉意,但我假设正则表达式旨在匹配类似 1280"
的东西,但如果"
不是有意的,这似乎更可取:
$pattern = '<^(.*(1280)|.*(500)|.*(400)|.*(250))>';
提取时,请使用组 2 到 5。或者,删除多余的组括号,然后对'<(1280|500|400|250)>'
进行第二次匹配以提取值。
注意:此答案中的选项不使用不区分大小写的标签,但如果由于正则表达式的其他部分而需要,您可以随时包含它。