0

尽管我对正则表达式不太熟悉,但我需要一些帮助将这个 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
4

1 回答 1

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构造函数。这里的问题是反斜杠需要加倍,因为 JavaScript 的字符串编译会吞噬每个未转义的反斜杠(因此您需要转义反斜杠以使其到达正则表达式引擎):

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在字符串上,或testexecr)。

于 2013-06-29T15:50:24.240 回答