仅替换两个其他PHP之间存在的字符串中的字符


Replacing only the characters in a string that exist between 2 others PHP

我在PHP中有一组关于人的数据,每一行都包含一系列关于这个人的详细信息。

[0] => name1,email1,year1,"country1a,country1b",date1
[1] => name2,email2,year2,"country2a,country2b,country2c",date2
.... etc

我遇到的问题是,为了处理它,我需要用逗号将每一行分解成一个多维数组,而"国家,国家"部分把事情搞砸了,因为它们需要分解成一项。每行的格式相同,但国家/地区的数量可能不同。

我试图用另一个分隔符|只替换"之间的逗号,以便以后可以用它来分解它们。

我已经尝试了几种不同的strnpos和str_replace,从我的搜索来看,我认为preg_replace将是最好的选择,但我在regex语法方面遇到了很大的困难。strnpos和str_replace似乎不太有效,因为它们必须同时跟踪这么多不同的字符串位置——这是我最初尝试的查找"s的位置的方法。这似乎应该是一件简单的事情,但事实并非如此。有人能帮我吗?

您遇到的是一个XY问题。您想将项目拆分成一行,但要做到这一点,您需要尝试替换引号中的逗号,这样它们就不会干扰分隔值的逗号。

退一步,尝试一下:

preg_match_all('/("[^"]+"|[^,]+),?/',$line,$matches);
$result = $matches[1];

这将为您提供一个包含项的数组,这些项要么用逗号分隔,要么用引号分隔。末尾的,?只是确保逗号被使用并且不匹配。

试试这个:

foreach($array as &$value)if(strpos($value,',')!==false)$value=explode(',',$value);

我是凭记忆做的,可能不管用。

今天在搜索的第4天找到了答案!这在我以前的成绩中从未出现过。

https://answers.yahoo.com/question/index?qid=20110425205225AAVdOh1这个答案在实现时非常有效:

foreach($tblArray as &$str) {
  $pattern = '/".+"/i';
  preg_match($pattern,$str,$matches);
  $orig = $matches[0];
  $edited = str_replace(', ','|',$orig);
  //also removed the ""s for future processing's sake
  $edited = str_replace('"',"",$edited);
  $str = str_replace($orig,$edited,$str);
}

这很简单,尽管我以前没有想过像这样的两步过程。我最终使用

[0] => name1,email1,year1,country1a|country1b,date1
[1] => name2,email2,year2,country2a|country2b|country2c,date2
(?=(?:[^"]*(?:"[^"]*"))*[^"]*$),

这会做你想做的事。请参阅演示。

http://regex101.com/r/lB2sH2/3