2013-09-23 50 views
0

排除比賽,我有這個簡單的dumy文本如何從正則表達式的結果

<base href="http://wjbty.lc/"/? 
<a href="common/home" /> 
<a href="common/home" /> 
<a href="/common/home" /> 
<a href="http://common/home" /> 
<a href="https://common/home" /> 
<a href="common/home" /> 

和我的正則表達式模式是(?:(href="))(?!\/)(?!https:\/\/)(?!http:\/\/)(.*)"

及其工作正常及配套的所有相關鏈接,但它總是包括href="在導致匹配。

以及如何從結果中排除href="。 任何人都可以測試它,然後回答,因爲有兩個答案,但沒有一個是工作。

Output in regex buddy

回答

3

在你表達你有一組額外的括號

(?:(href=")) 

的應該是

(?:href=") 

編輯: 我想你想這

/(?:href=")(?!\/)(?!https:\/\/)(?!http:\/\/)(.*)"/ 

所以它也不會捕獲接近的引號。 還記得preg_match_all返回一個數組或多個數組 第一個數組集合是總捕獲。 第二陣列組是組捕獲(你想要的)

額外的參數

flags參數可以是PREG_PATTERN_ORDER或PREG_SET_ORDER

PREG_PATTERN_ORDER裝置陣列[0]將是所有的捕獲信息,而數組[1]將是您在括號中捕獲的信息。

PREG_SET_ORDER表示每個匹配都會有一個數組元素,match [0]是總信息,match [1]是捕獲組。

+0

那不是工作。 –

+0

抱歉字符串,但這沒什麼匹配。 –

+0

你可以測試https://www.debuggex.com/或http://regexpal.com/ –

1

還有一種方法是使用\K功能從匹配結果中排除模式開頭匹配的子字符串(直到\K)。例如:

\shref="\K(?!(?:https?:/)?/)[^"]+ 

提醒:如果您使用斜線作爲模式定界符必須逃脫模式斜線,但它是一個更好的選擇,使用其他字符,例如~

請注意,根本不需要捕獲組,因爲您想獲得的是整個匹配。

如果你需要它,你可以在模式的末尾添加一個超前檢查右雙引號的存在:(?=")

0

,如果你想使用向前看符號和期待的屁股,這應該是你的答案:

(?<=href=")(?!\/)(?!https:\/\/)(?!http:\/\/)(.*)(?=\") 

演示在這裏:http://regex101.com/r/gS8iR6