找到第n个字符,除非它括在括号php中

时间:2014-01-11 14:27:01

标签: php regex

我使用以下函数查找字符串中的第n个字符,该字符效果很好。然而,有一个例外,让我们说它是一个逗号用于此目的,我需要改变的是,如果昏迷在(和)之内,那么它不应该计算

function strposnth($haystack, $needle, $nth=1, $insenstive=0)
{
   //if its case insenstive, convert strings into lower case
   if ($insenstive) {
       $haystack=strtolower($haystack);
       $needle=strtolower($needle);
   }
   //count number of occurances
   $count=substr_count($haystack,$needle);

   //first check if the needle exists in the haystack, return false if it does not
   //also check if asked nth is within the count, return false if it doesnt
   if ($count<1 || $nth > $count) return false;


   //run a loop to nth number of occurrence
   //start $pos from -1, cause we are adding 1 into it while searching
   //so the very first iteration will be 0
   for($i=0,$pos=0,$len=0;$i<$nth;$i++)
   {   
       //get the position of needle in haystack
       //provide starting point 0 for first time ($pos=0, $len=0)
       //provide starting point as position + length of needle for next time
       $pos=strpos($haystack,$needle,$pos+$len);

       //check the length of needle to specify in strpos
       //do this only first time
       if ($i==0) $len=strlen($needle);
     }

   //return the number
   return $pos;
}

所以我得到的正则表达式工作只在()之外捕获逗号,这是:     &#39; / *(?:[(] | $))(= [^?)] /&#39;

你可以看到一个在这里工作的实例: http://regex101.com/r/xE4jP8

但我不知道如何让它在strpos循环中工作,我知道我需要做什么,告诉它针有这个正则表达式异常,但我不知道如何让它工作。也许我应该放弃这个功能并使用另一种方法?

只是提到我想要的最终结果是在下一个字符串开始之前每6个逗号之后拆分字符串,例如:

rttr,ertrret,ertret(yes,no),eteert,ert ert,rtrter,0 rttr,ert(yes,no)rret,ert ret,eteert,ertert,rtrter,1 rttr,ertrret,ert ret,eteert,ertert,rtrter,0 rttr,ertrret,ert ret,eteert,ertert,rtrter,2 rttr,ert(white,black)rret,ert ret,eteert,ertert,rtrter,0 rttr,ertrret,ert ret,eteert,ertert,rtrter,0 rttr,ertrret,ert ret,et(blue,green)eert,ertert,rtrter,1

请注意,在字符串的下一部分开始之前总是有一个1位数字(1-3)和第6个逗号之后的空格但是我真的不能依赖它,因为它可能在字符串的早期发生这种模式可能发生所以我总是可以依赖于在第6个逗号后面的第一个数字和空格后分割字符串的事实。所以我想在此之后直接拆分字符串。

例如,上面的字符串将按如下方式分割:

rttr,ertrret,ertret(yes,no),eteert,ert ert,rtrter,0
rttr,ert(yes,no)rret,ert ret,eteert,ertert,rtrter,1
rttr,ertrret,ert ret,eteert,ertert,rtrter,0
rttr,ertrret,ert ret,eteert,ertert,rtrter,2 
rttr,ert(white,black)rret,ert ret,eteert,ertert,rtrter,0
rttr,ertrret,ert ret,eteert,ertert,rtrter,0
rttr,ertrret,ert ret,et(blue,green)eert,ertert,rtrter,1

如果我知道如何获得角色的位置,我可以很容易地做到这一点然后我可以使用substr来分割它但是更简单的方法可能是preg_split但我不知道如果这个部分可以解决这个问题

我希望我在解释时不会太混乱,我打赌我是:)

1 个答案:

答案 0 :(得分:2)

对于这些嵌套问题,正则表达式通常不是正确的工具。然而,当问题实际上并不复杂时,就像你的问题一样,正则表达式会做得很好。

试试这个:

(?:^|,)((?:[^,(]*(?:\([^)]*\))?)*)
^ start the search with a comma or the start of the string
        ^ start non capture group
           ^ search until comma or open parenthesis
                 ^ if parenthesis found then capture until 
                           ^ end of parenthesis  
                                ^ end of capture group repeat if necessary

查看实际操作:http://regex101.com/r/eS0cX4

正如您所看到的,这将捕获括号外的逗号之间的所有内容。如果您使用preg_match_all将所有这些匹配项放入数组中,则可以按照您喜欢的方式将其拆分。