为什么我的正则表达式,在PHP中运行时,编码为.net,有编码问题?

时间:2018-03-21 21:04:20

标签: c# php regex encoding

我承认,我不是使用正则表达式的忠实粉丝,但我真的很欣赏他们所取得的成就。我也理解它们是如何工作的,但是很长时间的人会让我感到困惑。

我有一个在PHP应用程序中使用的正则表达式,我无法控制它看起来像这样:

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

当我使用在线编码工具,或者甚至尝试将\转换为\时,我最终得到的是_上无效/无法识别的编码错误。

但是,我需要验证我的服务提供的URL,这些URL使用上述PHP应用程序提供的API。我.net的编码版本如下所示:

"/^(https?|ftp)\\:\\/\\/([a-z0-9+\\!\\*\\(\\)\\,\\;\\?\\&\\=\\$\\_\\.\\-]+(\\:[a-z0-9+\\!\\*\\(\\)\\,\\;\\?\\&\\=\\$\\_\\.\\-]+)?@)?[a-z0-9\\+\\$\\_\\-]+(\\.[a-z0-9+\\$\\_\\-]+)*(\\:[0-9]{2,5})?(\\/([a-z0-9+\\$\\_\\-]\\.?)+)*\\/?(\\?[a-z\\+\\&\\$\\_\\.\\-][a-z0-9\\;\\:\\@\\/\\&\\%\\=\\+\\$\\_\\.\\-]*)?(#[a-z\\_\\.\\-][a-z0-9\\+\\$\\_\\.\\-]*)?$/i";

这个正则表达式的一个很好的例子是"不接受百分比编码"。或者"没有空格"。我认为这是一个愚蠢的验证级别,我知道如何提供一个有效的网址,但我们有一些百分比编码,因为人们上传带有空格的文件名,所以我必须将它们除去并发送自动电子邮件..你得到了要点。

请帮我弄清楚为什么这个令人讨厌的正则表达式让我适合.net。

1 个答案:

答案 0 :(得分:1)

使用字符串文字来避免双重转义,并且@Wiktor指出不要逃避_

new System.Text.RegularExpressions.Regex(@"^(https?|ftp)\:\/\/([a-z0-9+\!\*\(\)\,\;\?\&\=\$_\.\-]+(\:[a-z0-9+\!\*\(\)\,\;\?\&\=\$_\.\-]+)?@)?[a-z0-9\+\$_\-]+(\.[a-z0-9+\$_\-]+)*(\:[0-9]{2,5})?(\/([a-z0-9+\$_\-]\.?)+)*\/?(\?[a-z\+\&\$_\.\-][a-z0-9\;\:\@\/\&\%\=\+\$_\.\-]*)?(#[a-z_\.\-][a-z0-9\+\$_\.\-]*)?$", System.Text.RegularExpressions.RegexOptions.IgnoreCase)