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,44table用户输入的单元格数据。我想让它们具有独特index性,但将其余文本保持在一起。

tableBegin并且tableEnd只是检查table cell数据

有什么帮助或提示吗?非常感谢!

4

2 回答 2

2

您可以尝试以下方法,请注意您需要 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);

输出

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
)

正则表达式解释

  • tableBegin: 匹配表开始
  • \s*: 匹配一个空格零次或多次
  • (.*?):匹配所有不贪婪的东西并将其放入第 1 组
  • \s*: 匹配一个空格零次或多次
  • tableEnd: 匹配表End
  • \s*: 匹配一个空格零次或多次
  • |: 或者
  • .*?(?=tableBegin|$): 匹配所有内容直到tableBegin行尾
  • 修饰符 :使s点也匹配换行符
于 2013-07-20T03:08:50.037 回答
1

如果您找不到 Regex 大师,这是一种丑陋的方法。

所以,这是你的文字

$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 回答