我正在使用PHP 5的preg函数,如果它有所作为。
考虑以下正则表达式匹配的常规语言。
([^{}] | {[0-9a-zA-Z_]+})*
该语言由任意数量字符组成的字符串组成,特殊嵌入式标记由左右大括号标记,其中包含一个或多个字母数字或下划线字符的字符串。例如,以下是语言中的有效字符串:
asdfasdf 1243#$ *#{A_123} asdf?{432U}
但是,在使用此正则表达式验证字符串时,我想获得这些花括号分隔标记的列表及其在字符串中的位置。考虑到前面的示例字符串,我想要一个告诉我的数组:
A_123: 20; 432U: 32
这是否可以使用正则表达式?或者我应该“手动”编写一个函数而没有regexp,它遍历字符串的每个字符并解析出我需要的数据?
如果这是一个基本问题,请原谅我;我刚刚学习!
答案 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