0

文字列から一連のテキストをグループ化し、その配列を作成しようとしています。

文字列は次のようなものです。

<em>string</em>  and the <em>test</em> here.  
tableBegin rowNumber:2, columnNumber:2  11 22 33 44 tableEnd  
<em>end</em> text here

次の結果のような配列を取得することを望んでいました

array (0 => '<em>string</em>  and the <em>test</em> here.',
         1=>'rowNumber:5',
         2=>'columnNumber:3',
         3=>'11',
         4=>'22',
         5=>'33',
         6=>'44'
         7=>'<em>end</em> text here')

11,22,33,44ユーザーが入力するtableセル データです。それらをユニークにしたいのですindexが、残りのテキストを一緒に保ちます。

tableBeginデータのtableEndチェックだけですtable cell

ヘルプやヒントはありますか?どうもありがとう!

4

2 に答える 2

2

You may try the following, note that you need PHP 5.3+:

$string = '<em>string</em>  and the <em>test</em> here.  
tableBegin rowNumber:2, columnNumber:2  11 22 33 44 tableEnd
SOme other text
tableBegin rowNumber:3, columnNumber:3  11 22 33 44 55 tableEnd
<em>end</em> text here';

$array = array();
preg_replace_callback('#tableBegin\s*(.*?)\s*tableEnd\s*|.*?(?=tableBegin|$)#s', function($m)use(&$array){
    if(isset($m[1])){ // If group 1 exists, which means if the table is matched
        $array = array_merge($array, preg_split('#[\s,]+#s', $m[1])); // add the splitted string to the array
      // split by one or more whitespace or comma --^
    }else{// Else just add everything that's matched
        if(!empty($m[0])){
            $array[] = $m[0];
        }
    }
}, $string);
print_r($array);

Output

Array
(
    [0] => string  and the test here.  

    [1] => rowNumber:2
    [2] => columnNumber:2
    [3] => 11
    [4] => 22
    [5] => 33
    [6] => 44
    [7] => SOme other text

    [8] => rowNumber:3
    [9] => columnNumber:3
    [10] => 11
    [11] => 22
    [12] => 33
    [13] => 44
    [14] => 55
    [15] => end text here
)

Regex explanation

  • tableBegin : match tableBegin
  • \s* : match a whitespace zero or more times
  • (.*?) : match everything ungreedy and put it in group 1
  • \s* : match a whitespace zero or more times
  • tableEnd : match tableEnd
  • \s* : match a whitespace zero or more times
  • | : or
  • .*?(?=tableBegin|$) : match everything until tableBegin or end of line
  • The s modifier : make dots also match newlines
于 2013-07-20T03:08:50.037 に答える
1

正規表現の第一人者が見つからない場合は、これを行う醜い方法を次に示します。

だから、これはあなたのテキストです

$string =   "<em>string</em>  and the <em>test</em> here.  
tableBegin rowNumber:2, columnNumber:2  11 22 33 44 tableEnd  
<em>end</em> text here";

そして、これは私のコードです

$E = explode(' ', $string);
$A =  $E[0].$E[1].$E[2].$E[3].$E[4].$E[5];
$B =  $E[17].$E[18].$E[19];
$All = [$A, $E[8],$E[9], $E[11], $E[12], $E[13], $E[14], $B];

print_r($All);

そして、これが出力です

Array
(
    [0] => stringandthetesthere.
    [1] => rowNumber:2,
    [2] => columnNumber:2
    [3] => 11
    [4] => 22
    [5] => 33
    [6] => 44
    [7] => endtexthere
)

もちろん、<em>ソース コードを表示しない限り、タグは表示されません。

于 2013-07-20T02:57:47.660 に答える