【问题标题】:Using php to detect character outside quotes使用php检测引号外的字符
【发布时间】:2016-05-11 16:34:27
【问题描述】:

我需要使用分隔符将字符串分成两部分。我所要做的就是使用explode()函数……我知道。

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

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

“大黄色”房子——靠近湖边

第一个连字符必须被忽略,因为它在引号中,因此我会得到两个这样的字符串:

1。 “大黄”房子
2。在湖边

它还应该能够检测转义引号。

例如:他不喜欢它,因为他不是来自这里。

在这种情况下,连字符不在引号内,因此应该拆分字符串。

有什么想法吗?

【问题讨论】:

  • 要跳过转义引号,只需将引用与回顾结合起来(?<!\\\\)'
  • 要检测出现在带引号的单词中的-,我建议使用lookaround 断言。这样在 meeting 一个 quote. 之前的连字符后面和前面都是字符
  • 这不是重复的,因为另一个问题根本不处理转义引号。此外,那里的答案没有很好地解释它是如何工作的。
  • 我做了一个IDEONE 演示。看看这是不是你需要的?
  • 由于问题已经结束,这里是ideone 的答案 - 您可以使用‘[^’]+’(*SKIP)(*FAIL)|- 作为拆分分隔符。诀窍是指定在交替 (|) 之前应该找到的所有内容。

标签: php regex split


【解决方案1】:

你可以使用

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

regex demo

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

这是IDEONE demo

$re = "/'[^'\\\\]*(?:\\\\.[^'\\\\]*)*'(*SKIP)(?!)|-/"; 
$strs = array("The 'big-yellow' house-is near the lake", "He doesn\'t like it because-he isn\'t from here."); 
foreach ($strs as $str) {
    $result = preg_split($re, $str);
    print_r($result);
}

输出:

Array( [0] => The 'big-yellow' house [1] => is near the lake)Array( [0] => He doesn\'t like it because [1] => he isn\'t from here.)

【讨论】:

    【解决方案2】:

    可能是这样的?

    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;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-10-25
      • 2012-09-27
      • 1970-01-01
      • 2014-07-16
      • 1970-01-01
      • 1970-01-01
      • 2018-05-01
      • 2017-12-23
      相关资源
      最近更新 更多