如何使正则表达式“偏好”某事?

时间:2014-10-13 02:49:51

标签: php regex preg-match

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];
}

1 个答案:

答案 0 :(得分:1)

是的,但有一个严重的警告:它慢得多,因为它重新扫描每个选项的字符串:

$pattern = '<^(.*(1280)|.*(500)|.*(400)|.*(250))">';

基本上,^将正则表达式锚定在左侧,然后每个选项都完全匹配。显然,对于长字符串来说,这是非常低效的,但它可以解决问题。

另外,如果它不是它们的功能,我道歉,但我假设正则表达式与1280"匹配,但如果"不是意图,那么这似乎是更可取的是:

$pattern = '<^(.*(1280)|.*(500)|.*(400)|.*(250))>';

提取时,请使用组2到5.或者,删除多余的组括号,再与'<(1280|500|400|250)>'进行匹配以提取值。

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