2017-08-17 68 views
1

我正在編寫生成包含通過DOI的文檔鏈接的html代碼的php代碼。鏈接應該指向https://doi.org/,然後是文檔的DOI。在php中轉義DOI鏈接 - 當esc_url()不夠時

由於結果是一個URL,我想我可以簡單地使用PHP的esc_url()功能就像

echo '<a href="' . esc_url('https://doi.org/' . $doi)) . '">' . esc_url('https://doi.org/' . $doi)) . '</a>'; 

,因爲這是一個應該在text nodes, attribute nodes or anywhere else使用。不幸的事情似乎並不容易...

問題是,DOI可以包含各種特殊字符,顯然不被esc_url()正確處理。這樣的DOI的一個很好的例子是

10.1002/(SICI)1521-3978(199806)46:4/5<493::AID-PROP493>3.0.CO;2-P

這應該鏈接到

https://doi.org/10.1002/(SICI)1521-3978(199806)46:4/5<493::AID-PROP493>3.0.CO;2-P

隨着$doi等於該DOI然而上面的代碼產生被顯示的鏈接和鏈接到https://doi.org/10.1002/​(SICI)1521-3978(199806)46:4/​5493::AID-PROP4933.0.CO;2-P

這引出了我的問題:如果esc_url()顯然不是逃避網址的一竅不通的解決方案,那麼我應該使用什麼?對於這種情況下,我能得到我想要與

esc_url(htmlspecialchars('https://doi.org/' . $doi)) 

的結果,但真的是這樣™做的的正確方法?這有沒有其他不需要的副作用?如果沒有,那麼爲什麼esc_url()也不能逃脫<>esc_html()會比htmlspecialchars()好嗎?如果是這樣,我應該把它嵌入到esc_url()

我知道有很多關於在stackoverflow上使用php轉義url的文章,但我找不到一個能夠解決<>標誌問題的文章。

+0

當你[檢查源代碼](https://core.trac.wordpress.org/browser/tags/4.8/src/wp-includes/formatting.php#L3775)時,你會發現這個函數刪除了字符不匹配正則表達式字符類'[^ a-z0-9-〜+ _。?#=!&;,/:%@ $ \ | * \'()\ [\] \\ x80 - \\ xff]'(將字符如'<' and '>'引入到最終應該成爲HTTP URL一部分的標識符中,我認爲這對於部分DOI人員來說是一個相當傾斜的決定。 ..) – CBroe

+0

我完全同意「dipshit決定」部分:)。 – cgogolin

回答

0

我不是PHP專家,但我知道DOI和SICI可能真的很煩人。

URL編碼和HTML編碼是不同的東西,所以分開考慮它們是有意義的。您必須轉義角括號才能製作正確的HTML。至於URL轉義,你也應該這樣做,因爲還有其他字符可能會破壞URL(例如#字符,它也會隨時彈出)。

因此,我建議:

'https://doi.org/' . htmlspecialcharacters(urlencode($doi)) 

,這將給你:

<a href="https://doi.org/10.1002%2F%28SICI%291521-3978%28199806%2946%3A4%2F5%3C493%3A%3AAID-PROP493%3E3.0.CO%3B2-P">Click here</a> 

注意的功能應用的順序,你不想編碼https://doi.org解析器的事實!

對於上述「dipshit決定」的評論......這當然不方便。但是SICI在DOI之前就已經存在了,這是我們不得不忍受的那些煩人的事情之一!

+0

'urlencode()'超過'rawurlencode()'的參數是什麼?爲什麼必須使用'htmlspecialcharacters()'? urlencode()的輸出不包含字母數字字符和+和 - 符號嗎? – cgogolin

+0

哦,它看起來像'urlencode'產生HTML安全的字符,所以'htmlspecialcharaters'沒有必要。然而,規範建議你這樣做:http://php.net/manual/en/function.urlencode.php – Joe

+0

至於'urlencode'與'rawurlencode',從PHP文檔看起來唯一的區別是治療'〜'人物。但是這兩頁並沒有實質性的相互引用。 – Joe