3

私はこの文字列を持っています$s:

ベン・セイ (#yellow) ねえ

現時点で私は使用しています:

$parts = array_filter(preg_split('/\s+/', $s));

だから私は配列要素の出力を持っています:

[0] ben
[1] say
[2] (#yellow)
[3] hey

次のような配列構造を作成することは可能でしょうか。

[0] ben
[1] say
[2] (
[3] #yellow
[4] )
[5] hey
4

5 に答える 5

3

次のように分割できますLookahead and Lookbehind Zero-Width Assertions

$parts = array_filter(preg_split('/\s+|(?=[()])|(?<=[()])/', $s));
于 2012-09-13T11:32:29.170 に答える
1

この置き換えを試すことができます:

$s = str_replace(array('(', ')'), array('( ', ' )'), $s);
$parts = array_filter(preg_split('/\s+/', $s));

ここでのコツは、あなた(と単語の間にスペースを追加して、単語が分割されるようにすることです。ただし、それはあなたの例に固有のものにしか機能しません。のようなもの((は、望ましくない結果を引き起こす可能性があります。その場合は、代わりに preg_replace を使用してみてください。

于 2012-09-13T11:24:57.860 に答える
0

必要に応じて正確に機能するワンライナー(必要さえありませんarray_filter):

$s = "ben say (ewfs) as";
$parts = preg_split('/\s+|(\()|(\))/', $s, null, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY)

/*
Array(
  0 => "ben",
  1 => "say",
  2 => "(",
  3 => "ewfs",
  4 => ")",
  5 => "as",
)
*/
于 2012-09-13T11:30:46.280 に答える
0
<?php

// function to explode on multiple delimiters
function multi_explode($pattern, $string, $standardDelimiter = ':')
{
    // replace delimiters with standard delimiter, also removing redundant delimiters
    $string = preg_replace(array($pattern, "/{$standardDelimiter}+/s"), $standardDelimiter, $string);

    // return the results of explode
    return explode($standardDelimiter, $string);
}

// test

    // set up variables
    $string = "zero  one | two :three/ four\ five:: six|| seven eight nine\n ten \televen twelve thirteen fourteen fifteen";
    $pattern = '/[:\|\\\\\/\s]/';  // colon (:), pipe (escaped '\|'), slashes (escaped '\\\\' and '\/'), white space (\s)

    // call function
    $result = multi_explode($pattern, $string);

    // display results
    var_dump($result);

?>

ソース: http://php.net/manual/en/function.explode.php

于 2012-09-13T11:25:33.133 に答える
-2

これはうまくいきます:

$parts = array_filter(preg_split('/[\s\(\)]+/', $s));
于 2012-09-13T11:25:19.483 に答える