2017-06-08 70 views
-2

我有以下的Perl代碼:轉換Perl的正則表達式PHP

$url=~s/\W//g; 

我想這個翻譯成PHP preg_replace

preg_replace("/[\W]/", "", $url); 

我不確定這是否正確。我真的不知道它做了什麼。

它來源於此功能,它格式化URL爲規範格式:

sub formatcanonical { 
    my $url = lc(shift); 

    $url =~ s/-/ /g; 
    $url =~ s/\s+/_/g; 
    $url =~ s/\W//g; 

    return $url; 
} 
+0

如果你不確定,你應該運行它。走着瞧吧。它看起來是正確的,儘管你不需要使用'[]',因爲如果你在一個字符組中只有一件事情,你不需要一個組。 – simbabque

+0

好的,所以這裏的問題是你不知道PHP,解決的辦法是學習它。我們無法幫助您,但我相信您可以在線獲取Google教程。 – Borodin

回答

-1

詢問之前,一定要試試,你可以,如果你走到這一步摸不着頭腦。

除此之外,您不需要[]。當移動到php時,正則表達式本身不會改變(或者至少對於常見的東西,當它看起來像是列出了所有的差異時,它也不會改變)。然而,從我所看到的,它應該以正確的方式工作。字符集只有在它們多於一個字符時纔有用。在正文中,正則表達式執行此操作:

  1. 用空格替換破折號。
  2. 用單下劃線替換所有連續的空格。
  3. 用空格替換任何非單詞字符。這些包括a-z,A-Z,0-9,_和一些其他特殊/ Unicode字符,例如ëè等。Capital \ W否定\ w匹配單詞字符。

其次,不要改變它的命令非常混亂(如果你真的在代碼中做它不會按預期返回)。

第三,PHP允許數組作爲參數preg_replace

都聚集到一起可以這樣做:

$string = 'Hello im a test-able string!'; 
echo preg_replace(
    [ 
     '/-/', 
     '/\s+/', 
     '/\W/', 
    ], 
    [ 
     ' ', 
     '_', 
     '', 
    ], 
    $string 
); 

雖然可讀性還是有點半信半疑。有人可能會選擇三個preg_replace函數,特別是一旦他們變得冗長。

最後,如果你曾經需要一個遊樂場進行正則表達式測試,請給regex101一個試試看,它的真棒。


此外,您在我打字過程中進行了3次編輯,現在我將忽略它。

+0

W按順序做什麼?我知道把破折號變成空格,空格變成空格,然後W做什麼? – jkushner

+0

添加了步驟和更多文本。 –

0

Perl代碼

$url=~s/\W//g; 

空虛替換$url匹配\W(非word字符)的所有字符和結果賦給回$url變量。

等效PHP代碼:

$url = preg_replace('/\W/', '', $url); 

最大可能的替換的數目可以通過4個參數$limit)來設置。默認情況下,$limit等於-1(無限制)。所以替換是全局執行的(Perl代碼使用g修飾符來實現)。

值得注意的是,「字」的定義取決於當前的區域設置(見Escape Sequences):

A「字」的字符是任何字母或數字或下劃線, 即任何字符它可以是Perl「單詞」的一部分。字母和數字的定義由PCRE的字符 表格控制,並且如果發生語言環境特定的匹配,則可能會有所不同。例如,對於 示例,在「fr」(法語)語言環境中,某些字符代碼大於128的字符代碼將用於重音字母,並且這些符號將與\ w匹配。