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

Php 当数据来自csv时,preg_match不返回匹配值,php,regex,preg-match,Php,Regex,Preg Match,我有一个csv上传在我的网站现在当我试图做预匹配的第一行的csv,它是返回空。请参阅下面的代码 $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|fam

我有一个csv上传在我的网站现在当我试图做预匹配的第一行的csv,它是返回空。请参阅下面的代码

 $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数据中检查时,为什么它不返回匹配?有人遇到过这种情况吗?

尝试使用

$htmlfile = file_get_contents($url);

$html = <<<HTML
echo $htmlfile;
HTML;
$htmlfile=file\u get\u contents($url);
$html=尝试使用

$htmlfile = file_get_contents($url);

$html = <<<HTML
echo $htmlfile;
HTML;
$htmlfile=file\u get\u contents($url);

$html=当您给出您提到的静态值时,它不会返回匹配项

$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);


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

当您给出您提到的静态值时,它不会返回匹配项

$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);


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

如果要忽略字符串开头的非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"
}

如果要忽略字符串开头的非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"
}

您好,谢谢您的输入,但我得到的是相同的东西,它不匹配。您好,谢谢您的输入,但我得到的是相同的东西,它不匹配。您能给我们看一下
$first_row
之后的
array_shift
的内容吗?您好,当array_shift时,$first_row的值是ï?昵称,nick_name_首字母,nick_name_代码。最近我注意到第一个字符串前有一些特殊字符。请在
array\u shift
之后向我们显示
$first\u row
的内容好吗?嗨,当array\u shift时,$first\u row的值是?昵称、昵称、昵称、昵称。我很晚才注意到第一个字符串之前有一些特殊字符。嗨,Jithin,它之前可能有一些特殊字符,或者可能是空白。如何使它根据其位置匹配表达式?我删除了正则表达式中的插入符号,因此我的新模式现在是/(昵称|尼克|名字|家族|名字| \“昵称|家族|名字)|/。这对我来说很有效,但我不知道这是否是一个好的解决方案。希望你在一开始就有空白。您可能需要修剪$first_行以删除空白。或者使用下面的正则表达式/^\s*(昵称| nick|u name | family|u name | |昵称| family|u name)(|)?/这样,现在its希望在开始时可能会有空白,因为这个$Upload|u content=文件($Upload|u file,file|忽略|NEW|行| file|SKIP|u EMPTY|行),它不是一个真正的空白;但它是一个特殊的角色“尼克·纳姆·特斯特”。你看到昵称前的“ï»»”了吗?这就是为什么它会在preg_比赛中返回false。删除插入符号不是一个好主意吗?/^\W*(昵称| nick | name | family | name | |昵称| family | name)/这将在开始时跳过非单词字符[^a-Za-z0-9]。嗨,Jithin,它前面可能有一些特殊字符,或者可能是空白。如何使它根据其位置匹配表达式?我删除了正则表达式中的插入符号,因此我的新模式现在是/(昵称|尼克|名字|家族|名字| \“昵称|家族|名字)|/。这对我来说很有效,但我不知道这是否是一个好的解决方案。希望你在一开始就有空白。您可能需要修剪$first_行以删除空白。或者使用下面的正则表达式/^\s*(昵称| nick|u name | family|u name | |昵称| family|u name)(|)?/这样,现在its希望在开始时可能会有空白,因为这个$Upload|u content=文件($Upload|u file,file|忽略|NEW|行| file|SKIP|u EMPTY|行),它不是一个真正的空白;但它是一个特殊的角色“尼克·纳姆·特斯特”。你看到昵称前的“ï»»”了吗?这就是为什么它会在preg_比赛中返回false。删除插入符号不是一个好主意吗?/^\W*(昵称|尼克|姓氏| | | | |姓氏)/这将跳过开头的非单词字符[^a-Za-z0-9]。