2012-04-16 57 views
1

使用此簡單紡織品標記時,紡織品類似乎會產生編譯錯誤。這似乎與鏈接發生:紡織錯誤:在編譯錯誤中使用url結果

"linktext":http://www.nu.nl 
["linktext":http://www.nu.nl] 

編譯錯誤:

Warning: preg_match() [function.preg-match]: Compilation failed: unrecognized character after (?< at offset 5 in /var/www/vhosts/sturb.nl/subdomains/bu/httpdocs/lib/textile.php on line 1355 

所有其他標記顯示正常人一樣。

順便說一句:我使用netcarver's紡織php類。

編輯: 這是錯誤被觸發的函數。 1355 線是$ok = preg_match($r, $uri, $m);

function parseURI($uri, &$m) 
{ 
    $r = "@^((?<scheme>[^:/?#]+):)?(//(?<authority>[^/?#]*))?(?<path>[^?#]*)(\?(?<query>[^#]*))?(#(?<fragment>.*))[email protected]"; 
    #  12      3 4      5    6 7    8 9 
    # 
    # scheme = $2 
    # authority = $4 
    # path  = $5 
    # query  = $7 
    # fragment = $9 

    $ok = preg_match($r, $uri, $m); 
    return $ok; 
} 
+0

'preg_match'在哪裏? – hjpotter92 2012-04-16 14:11:06

+0

我添加了觸發錯誤的preg_match函數 – stUrb 2012-04-16 14:13:44

回答

0

有可能是用「#」在你的regex號(不能在字符類的)的問題。他們必須正常逃脫。

更新

Aparently,在PHP中,#是除非指定了// X改性劑視爲文字。然後,如果用作文字,它將不得不逃脫。

您正在獲取的錯誤意味着正在使用的PHP版本不支持「命名捕獲緩衝區」。我不知道什麼版本的PHP實現了。

我看着你命名的文本文件php類,那個函數確實存在。我不知道他們是否爲你提供了PHP,或者你正在使用你自己的。我不是一個PHP專家。

在ideone.com上用於運行我的測試用例的PHP版本是5.2.11它支持命名捕獲緩衝區。

有一種方法可以告訴您可以將指定的結構從(?<name> --)轉換爲(--)。應該運行,或者至少讓你通過那個子表達式。

下面是測試情況有/無命名的捕獲緩衝區http://ideone.com/dm4Q8
嘗試找出正在使用的版本,也許它有一個內置的「版本()」功能。

這是一個擴展/合同正則表達式來測試。

'~ 
^(
    ([^:/?#]+) 
    : 
)? 
(
    // 
    ([^/?#]*) 
)? 
([^?#]*) 
(
    \? 
    ([^#]*) 
)? 
(
    \# 
    (.*) 
)? 
~x'; 

'~^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?~' 
+0

它似乎是另一個問題;擴展正則表達式不起作用......它說:'在<?在偏移73' – stUrb 2012-04-16 19:24:21

+0

@stUrb之後無法識別的字符 - 我更新了我的答案以包含一個沒有命名捕獲緩衝區的正則表達式。如果它正常工作,您應該更新版本的PHP。儘管'(?'..')'是一個正則表達式轉義序列分組,所以'?'後面的字符確定它是什麼,所以「(?')」不被識別,意味着不支持命名捕獲緩衝區。 – sln 2012-04-16 22:04:46