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コンストラクターに渡す必要があります。ここでの問題は、バックスラッシュを 2 倍にする必要があることです。これは、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お気に入りのマッチング関数 ( matchon 文字列、testまたはexecon r) で使用できるようになりました。

于 2013-06-29T15:50:24.240 に答える