简单正则表达式的问题

时间:2011-09-11 15:46:12

标签: php regex

我有一些字符串:{$foo.bar}{$foo.bar.anything}

地点:foo AND bar AND anything === alphanumeric

我想通过PHP通过preg_match(regular expression)匹配上述2个字符串,但没有任何点for example : {$foo}的字符串除外 非常感谢您的帮助,谢谢。

8 个答案:

答案 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)

这是我对问题的解决方案,有些替代方案取决于你想要提取的内容。

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

    <?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";