我有一些字符串:{$foo.bar}
和{$foo.bar.anything}
地点:foo AND bar AND anything === alphanumeric
我想通过PHP
通过preg_match(regular expression)
匹配上述2个字符串,但没有任何点for example : {$foo}
的字符串除外
非常感谢您的帮助,谢谢。
答案 0 :(得分:3)
/{\$[\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’s PCRE case-insensitive modifier来缩短它。
特别感谢sln让我保持警觉,直到它完美无缺。 :)
答案 1 :(得分:2)
假设php regex与perl相同
^\w+\.[\.\w]+$
这意味着从一个或多个字母数字开始,然后是.
,然后是一些字母数字或.
。 $
表示一直到字符串的结尾。
如果它不能以.
结束
^\w+\.[\.\w]+\w$
如果不允许..
由于非正则表达式引擎处理指定多个char子表达式的重复,它会变得很诡异。但如果你的确如此,我认为它就像
^\w+(\.\w+)+$
这意味着从一个或多个字母数字开始,跟随一个或多个字母数字后面的.
重复一次或多次。 $
表示一直到字符串的结尾。
答案 2 :(得分:2)
你可能想要preg_match_all
而不是preg_match
- 它会得到所有匹配,顾名思义,而不仅仅是第一个匹配。
至于你想要的正则表达式,这样的东西应该可以工作
/\{\$[a-z0-9]+\.([a-z0-9\.]+)+\}/i
答案 3 :(得分:2)
如果你看Regular expression to match a line that doesn't contain a word?,你似乎可以使用^((?!。)。)* $来包含它。使用\来逃避点。
答案 4 :(得分:2)
/(\{\$[a-z]+\.([a-z][a-z.])*[a-z]+\})/
因此,您首先匹配foo和点{$foo.
,然后可选地匹配任何字符和点{$foo.bar.
,最后匹配另一个字符串。 {$foo.bar.anything}
答案 5 :(得分:2)
\{\$[A-Za-z0-9]+\.[A-Za-z0-9]+\.?[A-Za-z0-9]*\}
答案 6 :(得分:2)
\{\$[a-zA-Z0-9]+(\.[a-zA-Z0-9]+)+\}
第一场比赛{$
。然后匹配任何字母数字字符串。然后匹配以.
开头的任何字母数字字符串。然后匹配}
。
答案 7 :(得分:2)
这是我对问题的解决方案,有些替代方案取决于你想要提取的内容。
{$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";