使用php检测引号外的字符

使用php检测引号外的字符,php,regex,split,Php,Regex,Split,我需要使用分隔符将字符串一分为二。我所要做的就是使用explode()函数。。。我知道 但我想做的是:我需要使用分隔符拆分字符串,但如果分隔符用引号括起来,则应该忽略它 假设我的分隔符是连字符(-),我需要拆分以下字符串: “黄色大房子”在湖边 必须忽略第一个连字符,因为它在引号中,因此我将使用以下两个字符串: 1.“大黄色”房子2。在湖边 它还应该能够检测转义引号 他不喜欢它,因为他不是这里人。 在这种情况下,连字符不在引号内,因此应拆分字符串 有什么想法吗?你可以用 '[^'\\]*(?:\

我需要使用分隔符将字符串一分为二。我所要做的就是使用explode()函数。。。我知道

但我想做的是:我需要使用分隔符拆分字符串,但如果分隔符用引号括起来,则应该忽略它

假设我的分隔符是连字符(-),我需要拆分以下字符串:

“黄色大房子”在湖边 必须忽略第一个连字符,因为它在引号中,因此我将使用以下两个字符串:

1.“大黄色”房子
2。在湖边 它还应该能够检测转义引号

他不喜欢它,因为他不是这里人。 在这种情况下,连字符不在引号内,因此应拆分字符串

有什么想法吗?

你可以用

'[^'\\]*(?:\\.[^'\\]*)*'(*SKIP)(?!)|-

“[^'\]*(?:\.\.[^'\]*)*”
部分将匹配单引号和任何转义实体,
(*跳过)(?!)
将强制正则表达式引擎在最后一个索引+匹配长度之后继续搜索匹配项

这是一个:

输出:


Array([0]=>大黄屋[1]=>在湖边)
Array([0]=>他不喜欢它,因为[1]=>他不是从这里来的。)

可能是这样的吗

function fsplit($str, $delimiter)
{
    $result = array();
    $inside_quote = false;
    $last_index = 0;
    for($i=0; $i<strlen($str);$i++)
    {
        if($str[$i] == $delimiter and !$inside_quote)
        {
            array_push($result, substr($str, $last_index, $i - $last_index));
            $last_index = $i+1;
        }
        elseif($str[$i] == "'")
        {
            $inside_quote = !$inside_quote;
        }

    }

    return $result;
}
函数fsplit($str,$delimiter)
{
$result=array();
$inside_quote=false;
$last_index=0;

对于($i=0;$iTo跳过转义引号,只需将引用与回溯结合起来
(?为了检测带引号的单词中出现的
-
,我建议使用
环顾
断言。例如,在遇到引号之前,在连字符后面加上字符。这不是重复的,因为另一个问题根本不涉及转义引号。此外,那里的答案也没有很好地解释我是如何使用引号的我已经做了一个演示。看看这是否是你需要的?因为问题已经结束,这里有一个答案-你可以使用
'[^']+'(*SKIP)(*FAIL)|-
作为拆分分隔符。诀窍是指定在替换之前不应该找到的所有内容(
)。
function fsplit($str, $delimiter)
{
    $result = array();
    $inside_quote = false;
    $last_index = 0;
    for($i=0; $i<strlen($str);$i++)
    {
        if($str[$i] == $delimiter and !$inside_quote)
        {
            array_push($result, substr($str, $last_index, $i - $last_index));
            $last_index = $i+1;
        }
        elseif($str[$i] == "'")
        {
            $inside_quote = !$inside_quote;
        }

    }

    return $result;
}