2017-03-02 45 views
3

我希望把這個:[title->link] 要這樣:<a href='link'>title</a>PHP的正則表達式找到太多

所以我有這行代碼

$content = preg_replace('/\[(.*)\-\>(.*)\]/', '<a target="_blank" href="$2">$1</a>', $content); 

this demo,它運作良好,但不是在我的代碼。 問題在於它將「[」字符視爲普通字符,因爲如果第一個(。*)。所以第一組可能會很長,如果有另一個「[」前...

喇嘛喇嘛[...] 喇嘛喇嘛[標題 - >鏈接] 大膽這裏是我的第一組,但其不是我想要的...

如何制止第一組爲第一個「[」爲maje sute juste「標題」是第一組?

回答

5

你想用[^]]*,而不是.*[^]]捕捉一切,是不是]所以它不會傳遞]而拍攝第一或第二組,防止您的問題。這不會阻止[bla bla[title->link]]包括'bla bla ['在您的第一個捕獲組中,如果可能發生這種嵌套,請考慮將[添加到否定組[^[]]

\[([^]]*)->([^]]*)\] 

https://regex101.com/r/SBCdcF/2

編輯:Sidyll指出->]不需要逃離這裏,但我選擇保持]逃脫,因爲它有時可能有一個正則表達式中的特殊意義。

+0

也不是最後的']'。這只是一個特殊的角色,如果之前有'['''的話。在這種情況下,沒有。 – sidyll

+0

雖然不能傷害,但是正則表達式引擎通常對於太多的轉義是相當不錯的,如果我不想讓它變得特別,我會留下一個可能會或可能不會特別的字符 –

+1

真的,傷害了眼睛只要。但真的,取決於引擎。在Vim默認情況下,例如'\ ['是字符類。文字不逃脫。字符需要被轉義或不取決於上下文。對於PHP,''''是一個特殊的,只要有'['之前。與']'相同。所以這就是爲什麼我投票選擇'\ [a \ -b \]'或'\ [a-b]'。兩者都是一樣的:)但讓我們留下來解釋讀者。感謝您的參考和不錯的答案! – sidyll