2016-02-02 8 views
6

デリミタ文字を使用して文字列を2つに分割する必要があります。私がしなければならないことは、explode()関数を使うことだけです...私は知っています。phpを使って引用符以外の文字を検出する

しかし、これは私がやろうとしていることです:区切り文字を使って文字列を分割する必要がありますが、区切り文字が引用符で囲まれている場合は無視してください。

のは、私の区切り文字はハイフンであるとしましょう( - )と私は、次の文字列を分割する必要があります。

「ビッグ黄色」湖の近くの家は、ある

最初のハイフンがあるため、無視する必要がありますそれゆえ、私はこのような二つの文字列で終わるだろう、引用符で囲まれている:

1.「ビッグ黄色の家
2.湖の近く

され、また、エスケープ引用符を検出することができるはず。

例:ここからはいないため、彼は好きではありません。

この場合、ハイフンは引用符内にないため、文字列を分割する必要があります。

どのような考えですか?

+1

だけルックバック 'と参照を組み合わせて、エスケープ引用符をスキップする(?<!\\\\) '' '-' – mario

+1

引用符で単語で発生を検出するために、私は'前後参照を使用することをお勧めします'アサーション。そのようなハイフンに続いて、** meeting ** a _quote_の前に文字が続きます。 –

+0

これは二重引用符ではありません。他の質問はエスケープされた引用符をまったく扱わないためです。また、そこの答えには、それがどのように機能するかについての良い説明はありません。 – Will

答えて

2

あなたは+ '[^'\\]*(?:\\.[^'\\]*)*'部分は、単一引用符を一致し、任意のエンティティをエスケープし、(*SKIP)(?!)は最後のインデックスの後に試合を探しに行くために正規表現エンジンを強制しますregex demo

を参照してください

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

使用することができます一致する長さ。

$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.)ここ

IDEONE demoです。

+1

これは私が探しているものです!ありがとう!!! –

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; 
} 
関連する問題