我想在 PHP 中使用一些正则表达式来验证通过表单传递的 UNC 路径。它应该是这样的格式:
\\server\something
... 并允许进一步的子文件夹。为了保持一致性,去掉尾部的斜线可能会很好,但如果需要的话我可以使用 substr 轻松地做到这一点。
我在网上读到在 PHP 中匹配一个反斜杠需要 4 个反斜杠(当使用“C 类字符串”时)并且我想我理解为什么会这样(PHP 转义(例如 2 = 1,所以 4 = 2),然后正则表达式引擎转义(剩余的 2 = 1)。我看到以下两个被引用为等价合适的正则表达式来匹配单个反斜杠:
$regex = "/\\\\/s";
或者显然这也是:
$regex = "/[\\]/s";
然而,这些会产生不同的结果,这与我匹配完整 UNC 路径的最终目标略有不同。
为了查看是否可以匹配两个反斜杠,我使用以下方法进行测试:
$path = "\\\\server";
echo "the path is: $path <br />"; // which is \\server
$regex = "/\\\\\\\\\/s";
if (preg_match($regex, $path))
{
echo "matched";
}
else
{
echo "not matched";
}
然而,上面的内容似乎匹配两个 或更多 反斜杠 :( 模式是 8 个斜杠,转换为 2 个,那么为什么输入 3 个反斜杠 ($path = "\\\\\\server") 匹配?
我想也许下面的方法会起作用:
$regex = "/[\\][\\]/s";
再一次,不 :(
在我跳出 window 之前请帮忙 lol :)
最佳答案
使用这个小 gem :
$UNC_regex = '=^\\\\\\\\[a-zA-Z0-9-]+(\\\\[a-zA-Z0-9`~!@#$%^&(){}\'._-]+([ ]+[a-zA-Z0-9`~!@#$%^&(){}\'._-]+)*)+$=s';
来源:http://regexlib.com/REDetails.aspx?regexp_id=2285 (采用PHP字符串转义)
上面显示的 RegEx 匹配有效的主机名(只允许几个有效字符)和主机名后面的路径部分(允许很多但不是所有字符)
关于反斜杠问题的旁注:
") to enclose your string 时,你必须知道 PHP 特殊字符转义.. "\\" 是 PHP 中的单个 \。 '),这些反斜杠也必须转义。\\) 被解释为单个反斜杠。'C:\\*.*' => C:\*.*)\') 的反斜杠被解释为单引号。 '我会回来的' => 我会回来的)'Just a\somewhere' => Just a\somewhere)\ 视为字符类,因此您需要再次为 RegEx 转义它。 \\,您必须编写 $regex = "\\\\\\\\" 或 $regex = '\\\\\\\\'
Single and double quoted PHP strings have special meaning of backslash. Thus if \ has to be matched with a regular expression \, then "\\" or '\\' must be used in PHP code.
关于您的问题:
why would an input of 3 backslashes ($path = "\\\server") match with regex
"/\\\\\\\\/s"?
原因是你没有定义边界(使用 ^ 作为开始,$ 作为字符串的结尾),因此它找到 \\ “某处” 导致正匹配。要获得预期的结果,您应该这样做:
$regex = '/^\\\\\\\\[^\\\\]/s';
上面的正则表达式有两个修改:
^开头只匹配字符串开头的两个\\[^\\] 表示的负字符类:后面没有附加反斜杠关于你最后的正则表达式:
$regex = "/[\\][\\]/s";
您对此处的反斜杠转义感到困惑(请参阅上面的说明)。 "/[\\][\\]/s" 被 PHP 解释为 /[\][\]/s,这会让 RegEx 失败,因为 \ 是 RegEx 中的保留字符,因此必须进行转义。
您的 RegEx 的这种变体可以工作,而且匹配两个反斜杠的任何出现,原因与我在上面已经解释的相同:
$regex = '/[\\\\][\\\\]/s';
关于用于匹配 UNC 路径的 PHP 正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9485091/
大约一年前,我决定确保每个包含非唯一文本的Flash通知都将从模块中的方法中获取文本。我这样做的最初原因是为了避免一遍又一遍地输入相同的字符串。如果我想更改措辞,我可以在一个地方轻松完成,而且一遍又一遍地重复同一件事而出现拼写错误的可能性也会降低。我最终得到的是这样的:moduleMessagesdefformat_error_messages(errors)errors.map{|attribute,message|"Error:#{attribute.to_s.titleize}#{message}."}enddeferror_message_could_not_find(obje
在我的应用程序中,我需要能够找到所有数字子字符串,然后扫描每个子字符串,找到第一个匹配范围(例如5到15之间)的子字符串,并将该实例替换为另一个字符串“X”。我的测试字符串s="1foo100bar10gee1"我的初始模式是1个或多个数字的任何字符串,例如,re=Regexp.new(/\d+/)matches=s.scan(re)给出["1","100","10","1"]如果我想用“X”替换第N个匹配项,并且只替换第N个匹配项,我该怎么做?例如,如果我想替换第三个匹配项“10”(匹配项[2]),我不能只说s[matches[2]]="X"因为它做了两次替换“1fooX0barXg
如何匹配未被反斜杠转义的平衡定界符对(其本身未被反斜杠转义)(无需考虑嵌套)?例如对于反引号,我试过了,但是转义的反引号没有像转义那样工作。regex=/(?!$1:"how\\"#expected"how\\`are"上面的正则表达式不考虑由反斜杠转义并位于反引号前面的反斜杠,但我愿意考虑。StackOverflow如何做到这一点?这样做的目的并不复杂。我有文档文本,其中包括内联代码的反引号,就像StackOverflow一样,我想在HTML文件中显示它,内联代码用一些spanMaterial装饰。不会有嵌套,但转义反引号或转义反斜杠可能出现在任何地方。
我已经在Sinatra上创建了应用程序,它代表了一个简单的API。我想在生产和开发上进行部署。我想在部署时选择,是开发还是生产,一些方法的逻辑应该改变,这取决于部署类型。是否有任何想法,如何完成以及解决此问题的一些示例。例子:我有代码get'/api/test'doreturn"Itisdev"end但是在部署到生产环境之后我想在运行/api/test之后看到ItisPROD如何实现? 最佳答案 根据SinatraDocumentation:EnvironmentscanbesetthroughtheRACK_ENVenvironm
我有一个驼峰式字符串,例如:JustAString。我想按照以下规则形成长度为4的字符串:抓取所有大写字母;如果超过4个大写字母,只保留前4个;如果少于4个大写字母,则将最后大写字母后的字母大写并添加字母,直到长度变为4。以下是可能发生的3种情况:ThisIsMyString将产生TIMS(大写字母);ThisIsOneVeryLongString将产生TIOV(前4个大写字母);MyString将生成MSTR(大写字母+tr大写)。我设法用这个片段解决了前两种情况:str.scan(/[A-Z]/).first(4).join但是,我不太确定如何最好地修改上面的代码片段以处理最后一种
我真的为这个而疯狂。我一直在搜索答案并尝试我找到的所有内容,包括相关问题和stackoverflow上的答案,但仍然无法正常工作。我正在使用嵌套资源,但无法使表单正常工作。我总是遇到错误,例如没有路线匹配[PUT]"/galleries/1/photos"表格在这里:/galleries/1/photos/1/edit路线.rbresources:galleriesdoresources:photosendresources:galleriesresources:photos照片Controller.rbdefnew@gallery=Gallery.find(params[:galle
当我使用has_one时,它工作得很好,但在has_many上却不行。在这里您可以看到object_id不同,因为它运行了另一个SQL来再次获取它。ruby-1.9.2-p290:001>e=Employee.create(name:'rafael',active:false)ruby-1.9.2-p290:002>b=Badge.create(number:1,employee:e)ruby-1.9.2-p290:003>a=Address.create(street:"123MarketSt",city:"SanDiego",employee:e)ruby-1.9.2-p290
我已经在mountainlion上成功安装了rbenv和rubybuild。运行rbenvinstall1.9.3-p392结束于:校验和不匹配:ruby-1.9.3-p392.tar.gz(文件已损坏)预期f689a7b61379f83cbbed3c7077d83859,得到1cfc2ff433dbe80f8ff1a9dba2fd5636它正在下载的文件看起来没问题,如果我使用curl手动下载文件,我会得到同样不正确的校验和。有没有人遇到过这个?他们是如何解决的? 最佳答案 tl:博士;使用浏览器从http://ftp.rub
如何使此根路径转到:“/dashboard”而不仅仅是http://example.com?root:to=>'dashboard#index',:constraints=>lambda{|req|!req.session[:user_id].blank?} 最佳答案 您可以通过以下方式实现:root:to=>redirect('/dashboard')match'/dashboard',:to=>"dashboard#index",:constraints=>lambda{|req|!req.session[:user_id].b
@raw_array[i]=~/[\W]/非常简单的正则表达式。当我用一些非拉丁字母(具体来说是俄语)尝试时,条件是错误的。我能用它做什么? 最佳答案 @raw_array[i]=~/[\p{L}]/使用西里尔字符进行测试。引用:http://www.regular-expressions.info/unicode.html#prop 关于ruby-正则表达式将非英文字母匹配为非单词字符,我们在StackOverflow上找到一个类似的问题: https://