-4

我需要在字符串中找到第一个逗号的位置,但不接受双引号括起来的文本作为匹配项。

例子:

word, word word (should return 4)
word word, word, word (should return 9)
word "word, word, word" word, word (should return 28)
word "word, word, word" dot dot "ignore, ignore" word, word (should return 53)
word 'word, word' word, word (should return 10)
4

2 回答 2

3

试试这个正则表达式:

if (preg_match('/^(?:[^,"]|"[^"]*")*(?=,)/', $str, $match)) {
    var_dump(strlen($match[0]));
}

该模式^(?:[^,"]|"[^"]*")*(?=,)只匹配任何一个序列

  • 既不是逗号也不是引号 ( [^,"]) 的字符,或
  • 带引号的字符串 ( "[^"]*")

最后是逗号((?=,)前瞻断言)。匹配的字符串是第一个逗号之前的字符串,它的长度也是第一个逗号的位置。

于 2013-04-16T20:27:08.070 回答
2

尝试以下操作:

$strings = array(
    'word, word word',
    'word word, word, word',
    'word "word, word, word" word, word',
    'word "word, word, word" dot dot "ignore, ignore" word, word',
    'word \'word, word\' word, word'
);

foreach($strings as $string){
    echo $string. ' : '. find($string).'<br>';
}

function find($str){
    $tmp = preg_replace_callback('/("[^"]+")/', function($m){
        return str_repeat('a',strlen($m[1]));
    }, $str);
    return strpos($tmp, ',');
}

想法:用“a”替换引号之间的所有字符,然后使用strpos()

输出:

word, word word : 4
word word, word, word : 9
word "word, word, word" word, word : 28
word "word, word, word" dot dot "ignore, ignore" word, word : 53
word 'word, word' word, word : 10

在线演示

于 2013-04-16T20:32:56.727 回答