2013-06-29 569 views
0

我需要一些幫助這個PHP正則表達式轉換爲一個Javascript一個,雖然我不是很熟悉的正則表達式:轉換PHP正則表達式的JavaScript正則表達式

$regex = "((https?|ftp)\:\/\/)?"; // SCHEME 
$regex .= "([a-z0-9+!*(),;?&=\$_.-]+(\:[a-z0-9+!*(),;?&=\$_.-]+)[email protected])?"; // User and Pass 
$regex .= "([a-z0-9-.]*)\.([a-z]{2,3})"; // Host or IP 
$regex .= "(\:[0-9]{2,5})?"; // Port 
$regex .= "(\/([a-z0-9+\$_-]\.?)+)*\/?"; // Path 
$regex .= "(\?[a-z+&\$_.-][a-z0-9;:@&%=+\/\$_.-]*)?"; // GET Query 
$regex .= "(#[a-z_.-][a-z0-9+\$_.-]*)?"; // Anchor 
+0

它應該是相同的。你試過了嗎? –

+0

可能的重複http://stackoverflow.com/questions/9309349/convert-php-regex-to-javascript-regex – Xavier

+1

@x_vi_r:這絕對不是重複的。 –

回答

3

當其他人是正確的,是通過其他途徑解析函數會更容易,下面是如何轉換正則表達式。

該正則表達式不包含JavaScript中沒有的高級構造,或者具有不同的含義。因此,你可以簡單地使用相同的表達字面正則表達式:

var r = /((https?|ftp)\:\/\/)?([a-z0-9+!*(),;?&=\$_.-]+(\:[a-z0-9+!*(),;?&=\$_.-]+)[email protected])?([a-z0-9-.]*)\.([a-z]{2,3})(\:[0-9]{2,5})?(\/([a-z0-9+\$_-]\.?)+)*\/?(\?[a-z+&\$_.-][a-z0-9;:@&%=+\/\$_.-]*)?(#[a-z_.-][a-z0-9+\$_.-]*)?/; 

現在正則表達式文字不支持級聯,而且也不JS有x修改,這將允許您分割的多行表達。因此,如果您想將模式保留在多個部分中,要對其進行註釋,則必須再次連接字符串並將該字符串傳遞給構造函數RegExp。這裏美中不足的是,反斜槓需要加倍,因爲JavaScript的字符串,編譯將會吞掉每個轉義反斜槓(所以你需要逃避反斜槓要他們達到正則表達式引擎):

var rString = "((https?|ftp)\\:\\/\\/)?"; // SCHEME 
rString += "([a-z0-9+!*(),;?&=\\$_.-]+(\\:[a-z0-9+!*(),;?&=\\$_.-]+)[email protected])?"; // User and Pass 
rString += "([a-z0-9-.]*)\\.([a-z]{2,3})"; // Host or IP 
rString += "(\\:[0-9]{2,5})?"; // Port 
rString += "(\\/([a-z0-9+\\$_-]\\.?)+)*\\/?"; // Path 
rString += "(\\?[a-z+&\\$_.-][a-z0-9;:@&%=+\\/\\$_.-]*)?"; // GET Query 
rString += "(#[a-z_.-][a-z0-9+\\$_.-]*)?"; // Anchor 
var r = new RegExp(rString); 

在任何情況下,r現在可以與您最喜歡的匹配功能(字符串上的matchr上的testexec)一起使用。

+0

非常有用。謝啦! – Myownway

相關問題