如何使用正则表达式在点之前提取(字母+数字+下划线)

时间:2014-01-09 14:23:18

标签: php regex

我想知道是否有一种快速的方式使用reg exp来提取垂直点之前的内容。我可能会使用爆炸但需要很长时间的处理。

示例字符串案例:

1. $str = 'a.b({ _first7 :1, second:2});';
2. $str = ' _first7 :1, second:2});';  // no bracket before _first7, and there is a space
3. $str = ' second:2});';  

我需要在案例(1,2)中获得_first7和第二,在案例3中获得第二。

我试图在{和:for _first7之间提取它并且它有效,但对于情况#2它不起作用。我试图在两者之间进行提取,并且:得到第二个并且它可以工作但是对于第三种情况它不起作用。

像这样:

$result = preg_match('/\{([a-zA-Z0-9_ ]+)\:/', $str, $output);
$result = preg_match('/\,([a-zA-Z0-9_ ]+)\:/', $str, $output);

另外,我不知道如何合并两个表达式以将_first7,second,... n var一起放在数组中并处理它们?

非常感谢您对完整解决方案的帮助。

谢谢!

2 个答案:

答案 0 :(得分:1)

基本上,您正在寻找键值对的键。

/[a-z0-9_]+(?=\s*:)/i

应该这样做。

答案 1 :(得分:1)

这样的模式应该有效:

(\w+)\s*:

但是你必须提取第一个捕获组。例如:

$str = 'a.b({ _first7 :1, second:2});';
$result = preg_match_all('/(\w+)\s*:/', $str, $output);
print_r($output[1]);
// Array ( [0] => _first7 [1] => second )

或者你可以使用前瞻:

\w+(?=\s*:)

例如:

$str = 'a.b({ _first7 :1, second:2});';
$result = preg_match_all('/\w+(?=\s*:)/', $str, $output);
print_r($output[0]); 
// Array ( [0] => _first7 [1] => second )