2017-09-19 5 views
-1

引用符で囲まれた文字列のリストを照合し、引用符で囲まれた部分文字列を取得しようとしています。 PHPのpreg_match_allは引用符で囲まれた文字列のリストを検証しますが、返された "$ matches"には引用符で囲まれた部分文字列がすべて含まれません。通常、最初と最後を返します。PHP preg_match_allからすべての一致を取得しようとしています

私は式のコンポーネントに名前(?P<name>)を割り当てようとしましたが、結果が重複しているように見えますが、まだ引用された部分文字列はすべて受け取りません。

DEFINEを使用してコンポーネントのサブルーチンを作成しても、結果は改善されませんでした。

以下は、入力しようとしている入力の例です。

'abcd','efgh"ij','list,543','Brown fox.','left(paren','right)paren' 

以下は私が使用している表現です。文字列は一重引用符で囲まれているだけです。私は文字列として気づく

Array 
(
    [0] => Array 
     (
      [0] => 'abcd','efgh"ij','list,543','Brownfox.','left(paren','right)paren' 
     ) 

    [1] => Array 
     (
      [0] => 'abcd' 
     ) 

    [2] => Array 
     (
      [0] => ,'right)paren' 
     ) 

    [3] => Array 
     (
      [0] => 'right)paren' 
     ) 

) 

を...

/(?x)^ (\x27[^\x27]*\x27) (,(\x27[^\x27]*\x27))* $/ 

preg_match_allへの呼び出しは次のようになります:

実行後
$pregex = '/(?x)^ (\x27[^\x27]*\x27) (,(\x27[^\x27]*\x27))* $/'; 
echo 'Match result: '.preg_match_all($pregex, $text_list, $matches, PREG_PATTERN_ORDER)."\n"; 

、$マッチが含まれている "ブラウンキツネ。" "Brownfox。"に変更されました。これは問題であり、引用符で囲まれた部分文字列をすべて列挙しません。私が見てみたいと思い何

は(そこに返される部分文字列の先頭に何のカンマはありませんが、彼らはそこでなければならない場合は、それをすることの通知)のようなものです:

Array 
(
    [0] => Array 
     (
      [0] => 'abcd','efgh"ij','list,543','Brownfox.','left(paren','right)paren' 
     ) 

    [1] => Array 
     (
      [0] => 'abcd' 
     ) 

    [2] => Array 
     (
      [0] => 'efgh”ij' 
     ) 

    [3] => Array 
     (
      [0] => 'list,543' 
     ) 

    [3] => Array 
     (
      [0] => 'Brown fox.' 
     ) 

    [3] => Array 
     (
      [0] => 'left(paren' 
     ) 

    [3] => Array 
     (
      [0] => 'right)paren' 
     ) 

) 

私は推測する私質問は:

  1. 私はpreg_match_allを使って何をしたいのですか?
  2. 可能であれば、何が間違っているのか、私は何か を理解していますか?
  3. 可能であれば、 の解析はどのように行う必要がありますか?

ありがとう!

+0

'$ string = explode( '、'、$ string); preg_match_all( "〜 '([^')]; $ string = array_map( 'trim'、$ string、array_fill(0、count($ string)、 ''")); ' –

+0

] +) '〜'、$ string、$ matches); print_r($ matches); ' –

+0

ありがとう!私はそれを試してみましょう!私は "〜"が何をしているのか分かりませんが、私はそれを調べます。 – John

答えて

-1

クレヨンに感謝しています。彼の表現は私の問題を解決しました。

部分文字列に1つ以上のコンマが含まれていると('efgh"ij','list,543','Brown fox'など)、"list,543"部分文字列内のカンマが解析で破棄されるように、正規表現ソリューションを選択しました。

私が持っていた元の正規表現は、入力を検証するという素晴らしい仕事をしましたが、部分文字列の配列を提供していませんでした。暴力が提供する正規表現クレヨンは、サブストリングのアレイを提供するんが、入力を検証しないので、私の解決策は、のように、両方を使用することである。

$token_count = 0; 

// Trim leading and trailing blanks from the input. 
$trimmed_input_text = trim($text_input); 

// Validate the input using preg_match 
$pregex_validate = '/(?x)^ [ ]* \( [ ]* (\x27[^\x27]*\x27) ( [ ]* , [ ]* (\x27[^\x27]*\x27))* [ ]* \) [ ]* $/'; 
if (preg_match($pregex_validate, $trimmed_input_text)) { 
    // Use preg_match_all to get the substrings in an array 
    $pregex_parse = "~'([^']+)'~"; 
    $token_count = preg_match_all($pregex_parse, $trimmed_input_text, $matches); 
} 

$matches収率:

Array 
(
    [0] => Array 
     (
      [0] => 'abcd' 
      [1] => 'efgh"ij' 
      [2] => 'list,543' 
      [3] => 'Brown fox.' 
      [4] => 'left(paren' 
      [5] => 'right)paren' 
     ) 

    [1] => Array 
     (
      [0] => abcd 
      [1] => efgh"ij 
      [2] => list,543 
      [3] => Brown fox. 
      [4] => left(paren 
      [5] => right)paren 
     ) 

) 

...まさに私が欲しいものです!

再び、クレヨンに感謝しています。

ジョン

+0

これを行うために正規表現を使うのは時間の無駄です。 'str_getcsv(trim($ str)、 '、'、" '")'は同じ行になります。 –

+0

優秀!ありがとう!そして、カンマを埋め込んだ文字列を正しく処理しました!ありがとう! PHPのほぼ20年の間、str_getcsvは私が走っていなかった1つの関数です。 – John

関連する問題