将php正则表达式转换为javascript正则表达式

时间:2013-06-29 15:32:07

标签: php javascript regex

我需要一些帮助将这个PHP正则表达式转换为Javascript版本,虽然我对正则表达式不是很熟悉:

$regex = "((https?|ftp)\:\/\/)?"; // SCHEME
$regex .= "([a-z0-9+!*(),;?&=\$_.-]+(\:[a-z0-9+!*(),;?&=\$_.-]+)?@)?"; // 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

1 个答案:

答案 0 :(得分:3)

虽然其他人都是正确的,但使用其他方法来解析函数会更容易,这里是你如何转换正则表达式。

正则表达式不包含JavaScript中不可用或具有不同含义的高级构造。因此,您可以在正则表达式文字中使用相同的表达式:

var r = /((https?|ftp)\:\/\/)?([a-z0-9+!*(),;?&=\$_.-]+(\:[a-z0-9+!*(),;?&=\$_.-]+)?@)?([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构造函数。这里的问题是反斜杠需要加倍,因为JavaScripts字符串编译会吞噬每个未转义的反斜杠(所以你需要转义它们的反斜杠才能到达正则表达式引擎):

var rString = "((https?|ftp)\\:\\/\\/)?"; // SCHEME
rString += "([a-z0-9+!*(),;?&=\\$_.-]+(\\:[a-z0-9+!*(),;?&=\\$_.-]+)?@)?"; // 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现在都可以与您最喜欢的匹配函数一起使用(match对字符串,testexec r