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

时间:2014-09-04 17:31:54

标签: php regex string

我在PHP中有一组关于人的数据,其中每行包含关于该个人的一系列细节。

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

我遇到的问题是我需要用逗号将每一行爆炸成一个多维数组,以便我处理它的方式,并且“国家,国家”部分正在搞乱,因为他们需要被爆炸为1项。每行之间的格式相同,但国家/地区的数量可能会有所不同。

我正在尝试仅使用另一个分隔符|替换“”之间的逗号这样我以后就可以把它们炸掉了。

我已经尝试了几种不同的strnpos和str_replace,从我的搜索中我认为preg_replace将是最好的选择,但我正在用正则表达式语法非常困难。 strnpos和str_replace似乎不是非常有效,因为必须同时跟踪这么多不同的字符串位置 - 这是我最初尝试找到“s”的位置的方式。看起来这应该是一件简单的事情,但事实并非如此。有人可以帮助我吗?

4 个答案:

答案 0 :(得分:1)

你所拥有的是一个XY问题。您希望将项目拆分为一行,但为此,您要尝试替换引号中的逗号,以免它们干扰分隔值的逗号。

退后一步,尝试:

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

这应该为您提供一个包含项目的数组,这些项目可以用逗号分隔或用引号分隔。最后的,?只是确保使用逗号并且不匹配。

答案 1 :(得分:0)

试试这个:

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

我用内存做了这个,它可能不起作用。

答案 2 :(得分:0)

今天在搜索第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

答案 3 :(得分:0)

(?=(?:[^"]*(?:"[^"]*"))*[^"]*$),

这将做你想要的。见演示。

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