2014-09-02 45 views
1

我想知道是否有更简单,更好,更有效的方式从字符串中提取数据,而不是将其分割成块并将这些块存储在变量中。例如,我有一行包含一些/分隔的字段(注意:并非所有字符都是/分隔的)。PHP比分割字符串更简单

/ST = XX/L = XX/O = XX/CN = Cliento/

我只需要获取CN字段的值。对于这个我现在做的事情:

 preg_match('/\/CN=[a-z_\-0-9].*\//i', $line, $client3); 
     $client2 = split('=', $client3[0]); 
     $client1 = split('/', $client2[1]); 
     print 'Client: '. $client1[0]."\n"; 

但我敢肯定有一个更好的解决方案。

+1

http://php.net/manual/en/function.ldap-explode-dn.php – 2014-09-02 10:36:24

+1

'$ values = array(); parse_str(str_replace('/','&',$ line),$ values); var_dump($ values);' – 2014-09-02 10:39:00

+0

这不是特定的ldap格式,而是一个日志文件,该行还包含带有逗号和其他文本的日期。只是其中一部分有几个字段与/ -s,甚至从我只需要一个CN。 – munin24 2014-09-02 10:42:47

回答

0

比做两个裂口相反,你可以只返回需要使用一个子串匹配的部分:

$line = '/ST=XX/L=XX/O=XX/CN=Cliento/'; 
preg_match('/\/CN=[a-z_\-0-9].*\//i', $line, $matches); 
echo substr($matches[0], 4, -1); 
0

我会尝试这与一个正则表达式。下面的表达式工作正常:

/(?<=CN\=)[a-zA-Z_\-0-9]+/ 

这个指令表达式提取“CN =”后面的所有内容。还需要在干草堆中有一个“CN =”。