2014-10-13 72 views
0
萬一
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... 

的$匹配[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]; 
} 
+0

由於你所有的變化都是常量表達式,所以你不需要一個正則表達式。使用字符串函數來查找您正在查找的內容/優先級。如果使用正則表達式處理它的速度較慢,並且您會發現無法添加其他每個交替常見的分解子表達式,則渲染正則表達式最終將毫無用處。 – sln

+0

@sln感謝您的評論,我正在爲url提取進行編碼,並且這只是比較簡單的代碼。 – igonejack

+1

正如我之前所說,我沒有看到任何正常表達的可變性允許,通常是不可能的。這是因爲正則表達式_Alternation_是正則表達式中唯一可用的_Prefer_。因爲你的表達式需要錨定'tumblr _ [^ _] + _(1280 | 500 | 400 | 250)\。(?: png | jpg | gif)))「>'來定位文件名, – sln

回答

1

是的,但有一個嚴重的警告:這是要慢得多,因爲它重新掃描每個選項的字符串:

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

基本上, ^將正則表達式定位到左側,然後將每個選項全部匹配。顯然,這對於長字符串來說效率非常低,但它的確有用。

另外,我道歉,如果這不是他們的功能,但我假設的正則表達式是爲了滿足像1280",但如果"的目的不是,看來這將是可取的:

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

提取時,使用組2到5.也可以刪除多餘的組括號,然後執行第二次匹配'<(1280|500|400|250)>'以提取該值。

注意:此答案中的選項不使用不區分大小寫的標記,但如果由於正則表達式的某些其他部分,您可以隨時包含它。

+0

你的' $'會導致正則表達式不匹配,因爲它是字符串錨點的結尾,'^'是字符串錨點的開始,這符合這裏的用例。 – nhahtdh

+0

@nhahtdh哦,天哪,這很尷尬,謝謝你糾正它。認爲它可能會在深夜裏在這裏爲我發佈現在回答的問題,或者我可能已經失去了我的whites。 –

+0

感謝您的回答,我想粘貼我的完整代碼以獲得更好的閱讀效果: – igonejack

相關問題