绝对的初学者正则表达式问题

时间:2010-08-14 03:14:10

标签: php regex

我正在使用PHP 5的preg函数,如果它有所作为。

考虑以下正则表达式匹配的常规语言。

([^{}] | {[0-9a-zA-Z_]+})*

该语言由任意数量字符组成的字符串组成,特殊嵌入式标记由左右大括号标记,其中包含一个或多个字母数字或下划线字符的字符串。例如,以下是语言中的有效字符串:

  

asdfasdf 1243#$ *#{A_123} asdf?{432U}

但是,在使用此正则表达式验证字符串时,我想获得这些花括号分隔标记的列表及其在字符串中的位置。考虑到前面的示例字符串,我想要一个告诉我的数组:

A_123: 20; 432U: 32

这是否可以使用正则表达式?或者我应该“手动”编写一个函数而没有regexp,它遍历字符串的每个字符并解析出我需要的数据?

如果这是一个基本问题,请原谅我;我刚刚学习!

1 个答案:

答案 0 :(得分:2)

要捕获偏移量,您可以设置PREG_OFFSET_CAPTURE标记。 http://php.net/manual/en/function.preg-match.php

preg_match ($regex, $subject, $matches, PREG_OFFSET_CAPTURE);

您可以自己运行以下脚本并查看结果:

$regex = '~({(\w+)})+~';
$str = 'asdfasdf 1243#$*#{A_123}asdf?{432U}';

preg_match_all($regex, $str, $m, PREG_OFFSET_CAPTURE);
$tags = $m[1];

echo '<pre>';
print_r($tags); // prints tags and their offsets
echo '</pre>';

关于模式:

  • \w是一个等同于以下字符类的转义序列:[a-zA-Z0-9_]
  • 圆括号(...)用于分组,也可以创建反向引用。
  • +是一个量词,表示前一个模式的“一个或多个”

关于正则表达式的一个很好的资源:http://www.regular-expressions.info