如何制作正确的正则表达式

时间:2010-02-22 21:35:31

标签: php regex

我想获得$ {1} =标题,$ {2} =开放,$ {3} = Bla-bla-bla。

{{Title|Open
Bla-bla-bla 
}}

4 个答案:

答案 0 :(得分:3)

$string = "{{Title|Open
Bla-bla-bla 
}}";

preg_match('/^\{\{([^|]+)\|(.*?)[\r\n]+(.*?)\s*\}\}/', $string, $matches);
print_r($matches);

答案 1 :(得分:3)

这样的事情:

$str = <<<STR
{{Title|Open
Bla-bla-bla 
}}
STR;

$matches = array();
if (preg_match("/^\{\{([^\|]+)\|([^\n]+)(.*)\}\}$/s", $str, $matches)) {
    var_dump($matches);
}

它会让你:

array
  0 => string '{{Title|Open
Bla-bla-bla 
}}' (length=28)
  1 => string 'Title' (length=5)
  2 => string 'Open' (length=4)
  3 => string '
Bla-bla-bla 
' (length=14)

这意味着,在$matches[1]$matches[2]$matches[3]上使用trim后,您将获得所要求的内容: - )


解释正则表达式:

  • 从字符串开头匹配:^
  • 两个{个字符,必须进行转义,因为它们具有特殊含义
  • 任何不是|,至少一次:[^\|]+
    • 介于()之间,因此它被捕获 - 作为结果的第一部分返回
    • |也必须进行转义。
  • 一个|字符 - 必须转义。
  • 任何不是换行符,至少有一次:[^\n]+
    • 介于()之间,因此它也被捕获 - 结果的第二部分
  • .*几乎“任何”任何次数
    • 介于()之间,因此它也被捕获 - 结果的第三部分
  • ,最后,两个} (也已转义)
  • 和字符串的结尾:$

请注意正则表达式具有s (dotall)修饰符;见Pattern Modifiers,关于那个。

答案 2 :(得分:1)

http://www.gskinner.com/RegExr/

一个玩耍和学习正则表达式的有用场所。

答案 3 :(得分:0)

Perl:

/\{\{         # literal opening braces
 (.*?)        # some characters except new line (lazy, i. e. as less as possible)
 \|           # literal pipe
 (.*?)        # same as 2 lines above
 \n           # new line
 ([\s\S]*?)   # any character, including new line (lazy)
 \}\}/x;      # literal closing braces

制定更精确的解决方案取决于您想要提取字段的确切规则。