我有类似于:{$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}
这是我的问题解决方案,根据您想要提取的内容,有一些替代方案。
- 只提取整个
{$aaa.bbb[.ccc[.ddd ...]]}
,前提是它至少包含一个点 - 从
{$aaa.bbb}
事物中提取内容(例如aaa.bbb
( - 只考虑由两个或三个组件组成的标签(忽略
{$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";