当数据来自csv时,preg_match不返回匹配值

时间:2012-07-03 11:36:51

标签: php regex preg-match

我现在在我的网站上有一个csv上传,当我尝试为csv的第一行做pregmatch时,它返回空。请参阅下面的代码。

 $uploaded_file = $upload_dir . $_FILES['my_upload_file']['name'];
 $uploaded_content = file( $uploaded_file, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES );
 $regx_pattern = '/^(nickname|nick_name|family_name|\"nickname|"family_name)_/'; 
 $first_row = array_shift( $uploaded_content );
 $row_match = preg_match( $regx_pattern , $first_row, $matches );
 var_dump($matches);

结果:

array
    empty

但是,如果我在脚本中将$first_row声明为静态值,请执行以下操作:

$first_row= 'nickname,nick_name_initial,nick_name_code';

它会返回一个匹配项。当我从我的csv数据中检查它时,为什么不返回匹配?有人遇到过这个吗?

3 个答案:

答案 0 :(得分:2)

如果你想忽略非alphanum而不是在字符串开头引用字符,你可以这样做:

$regx_pattern = '/^[^\w"]*(nickname|nick_name|family_name|\"nickname|"family_name)_?/';
// $first_row = array_shift( $uploaded_content );
$first_row = 'nickname,nick_name_initial,nick_name_code';
$row_match = preg_match( $regx_pattern , $first_row, $matches );
var_dump($matches);

<强>输出:

array(2) {
  [0]=>
  string(14) "nickname"
  [1]=>
  string(8) "nickname"
}

答案 1 :(得分:1)

当你提到静态值时,它不会返回匹配。

$regx_pattern = '/^(nickname|nick_name|family_name|\"nickname|"family_name)_/'; 
//$first_row = array_shift( $uploaded_content );
$first_row= 'nickname,nick_name_initial,nick_name_code';
$row_match = preg_match( $regx_pattern , $first_row, $matches );
var_dump($matches);

它不起作用,因为在正则表达式中,您期望在键之后的下划线和您给出的静态值,对于键昵称,没有最后的下划线。您必须将其设为可选,如下所示。

$regx_pattern = '/^(nickname|nick_name|family_name|\"nickname|"family_name)(_)?/'; 
//$first_row = array_shift( $uploaded_content );
$first_row= 'nickname,nick_name_initial,nick_name_code';
$row_match = preg_match( $regx_pattern , $first_row, $matches );
var_dump($matches);

OR

在您上传的csv文件中,有可能在开头有一个空格。因为您期望键将以第一个字母本身(^)开头。

答案 2 :(得分:0)

尝试使用

$htmlfile = file_get_contents($url);

$html = <<<HTML
echo $htmlfile;
HTML;

因为您阅读并保留了文件的内容,但这种方式无法处理