简单正则表达式出现问题


Problem with simple regular expression

我有类似于:{$foo.bar}{$foo.bar.anything}的字符串

其中:foo AND bar AND anything === alphanumeric

我想通过preg_match(regular expression)匹配PHP中的以上2个字符串,除了没有任何点的for example : {$foo}

谢谢你的帮助。

/{'$['da-z]+(?:'.['da-z]+)+}/i

匹配

{$foo.bar}
{$foo.Bar.anything}
{$foo.bar.anything1.anything2.anything3}
{$foo.bar.anything.a.b.c}

与不匹配

{$foo}
{$foo.}
{$foo bar}
{$foo.bar anything}
{$foo.bar......anything..}
{$foo.bar.anything.}
{$foo.bar.anything.a.b.c..}

领养Joe;使用PCRE不区分大小写的修饰符将其缩短一点。

特别感谢sln让我保持警觉,直到它;s完美。:(

'{'$[A-Za-z0-9]+'.[A-Za-z0-9]+'.?[A-Za-z0-9]*'}

您可能想要preg_match_all而不是preg_match——顾名思义,它可以获得所有匹配项,而不仅仅是第一个。

至于你想要的正则表达式,像这样的东西应该能在中工作

/'{'$[a-z0-9]+'.([a-z0-9'.]+)+'}/i

假设php regex与perl 相同

^'w+'.['.'w]+$

这意味着从一个或多个字母数字开始,然后是.,然后是一些字母数字或.$表示一直到字符串的末尾。

如果不能以.结束,则

^'w+'.['.'w]+'w$

如果不允许..,它会得到tricker,因为not-ell正则表达式引擎处理指定多字符子表达式的重复。但如果你的是,我认为它有点像

^'w+('.'w+)+$

这意味着从一个或多个字母数字开始,然后是的一个或更多个重复,再加上.和一个或几个字母数字。$表示一直到字符串的末尾。

'{'$[a-zA-Z0-9]+('.[a-zA-Z0-9]+)+'}

第一场比赛{$。然后匹配任何字母数字字符串。然后匹配以.开头的任何字母数字字符串。然后匹配}

/('{'$[a-z]+'.([a-z][a-z.])*[a-z]+'})/

因此,首先匹配foo和一个点{$foo.,然后可选地匹配任何字符和点{$foo.bar.,最后匹配另一个字符串。{$foo.bar.anything}

这是我的问题解决方案,根据您想要提取的内容,有一些替代方案。

  1. 只提取整个{$aaa.bbb[.ccc[.ddd ...]]},前提是它至少包含一个点
  2. {$aaa.bbb}事物中提取内容(例如aaa.bbb(
  3. 只考虑由两个或三个组件组成的标签(忽略{$aaa}{$aaa.bbb.ccc.ddd}(

代码:

<?php
$subject = '{$foo.bar} {$foo.bar.baz} {$foo} {$another-foo.bar} {$foo.bar.baz.boh}';
print "Matching the whole string'n";
preg_match_all(
   '/{'$[a-zA-Z0-9]+(?:'.[a-zA-Z0-9]+)+}/',
   $subject, $m);
print var_export($m) ."'n'n";
print "Matching only the content'n";
preg_match_all(
   '/{'$([a-zA-Z0-9]+(?:'.[a-zA-Z0-9]+)+)}/',
   $subject, $m);
print var_export($m) ."'n'n";
print "Matching for strings containing only 1 or two dots'n";
preg_match_all(
   '/{'$([a-zA-Z0-9]+(?:'.[a-zA-Z0-9]+){1,2})}/',
   $subject, $m);
print var_export($m) ."'n'n";