如何使正则表达式“首选”某些东西


How to make regular expression "prefer" something?

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)>'进行第二次匹配以提取值。

注意:此答案中的选项不使用不区分大小写的标签,但如果由于正则表达式的其他部分而需要,您可以随时包含它。