2011-03-05 34 views
3

我正在將我發現的eregi_replace函數轉換爲preg_replace,但eregi字符串包含關於其中鍵盤上的每個字符。所以我試圖用英鎊作爲分隔符..目前它正在工作,但我想知道它是否可能會導致問題,因爲它是一個非標準的字符?可以在preg_replace中使用£作爲分隔符嗎?

這裏是eregi:

function makeLinks($text) { 
$text = eregi_replace('(((f|ht){1}tp://)[[email protected]:%_\+.~#?&//=]+)', 
'<a href="\\1">\\1</a>', $text); 
$text = eregi_replace('([[:space:]()[{}])(www.[[email protected]:%_\+.~#?&//=]+)', 
'\\1<a href="http://\\2">\\2</a>', $text); 

    return $text;} 

和預浸:

function makeLinks($text) { 
    $text = preg_replace('£(((f|ht){1}tp://)[-a-zA-^[email protected]:%_\+.~#?&//=]+)£i', 
    '<a href="\\1">\\1</a>', $text); 
    $text = preg_replace('£([[:space:]()[{}])(www.[[email protected]:%_\+.~#?&//=]+)£i', 
    '\\1<a href="http://\\2">\\2</a>', $text); 

     return $text; 
} 
+4

這個神聖符號的褻瀆使者!女王將聽到這個消息。 – 2011-03-05 23:35:04

回答

2

£有問題,因爲它不是ASCII字符。它來自Latin-1字符集,只有當您的PHP腳本也使用8位表示法時纔會起作用。如果你的文件被編碼爲UTF-8,那麼£將被表示爲兩個字節。而PHP中的PCRE會跳過這個。 (至少我的版本是。)

1

你會知道正在分析的數據比我們的要好。就正則表達式而言,它與任何其他ASCII值沒有區別。

雖然我必須問:傳統有什麼不對,然後才逃脫它?或者使用具有字符範圍的類?

+0

我原本是向後逃避(試圖逃避分隔符,而不是在表達式中分隔符的發生...... lol),但後來我更加好奇它是否使用這樣的字符是一個壞主意。 – Damon 2011-03-06 02:32:16

3

您可以使用括號來界定一個正則表達式,而不是單個字符,例如:

preg_replace('(abc/def#ghi)i', ...); 

這將可能比試圖找到一個不起眼的角色,這不是你的表情的(但)的一部分更好。

2

正如@Chris指出的那樣,您可以使用成對的括號字符作爲分隔符,但它們必須在整個正則表達式中正確平衡。例如,'<<>'將不起作用,但'<<>>'將會。您可以使用(),[],{}<>中的任意一個,但我建議使用大括號或方括號;圓括號在正則表達式中很常見,尖括號用於轉義序列,如(?>...)(原子組)和(?<=...)(向後看)。

但是我在@Brad上:爲什麼不只是在正則表達式中出現帶反斜槓的分隔符?

相關問題