Preg_split,如何保持分隔符?

时间:2015-03-02 09:11:35

标签: php html regex delimiter preg-split

我试图保留preg_split分隔符(< tr>和< / tr>),而不将它分隔到新的数组位置,并且无法弄清楚它。所以任何帮助都将不胜感激。

我试图从下一个html代码中获取每一行并将其放在不同的数组位置:

<tr><td> one column </td><td>second column</td></tr><tr><td> one column </td><td>second column</td></tr>

以下是我所拥有的:

array_unique(preg_split('[<tr[^>]*>(.*?)</tr>]',$table,NULL,PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY));

如果我对我的数组执行var_dump,则此代码显示:

array(2) {
    [0]=>
    string(43) "<td> one column </td><td>second column</td>"
    [1]=>
    string(43) "<td> one column </td><td>second column</td>"
  }

我想要的是:

array(2) {
    [0]=>
    string(52) "<tr><td> one column </td><td>second column</td></tr>"
    [1]=>
    string(52) "<tr><td> one column </td><td>second column</td></tr>"
  }

事先,非常感谢你的帮助和时间。

2 个答案:

答案 0 :(得分:1)

只需捕获<tr>标记。由于您正在使用PREG_SPLIT_DELIM_CAPTURE参数,因此也会返回正在捕获的字符。

array_unique(preg_split('[(<tr[^>]*>.*?</tr>)]',$table,NULL,PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY));

示例1:

$st = '<tr><td> one column </td><td>second column</td></tr><tr><td> one column </td><td>second column</td></tr>';
$match = preg_split('[(<tr[^>]*>.*?</tr>)]',$st,NULL,PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);
print_r($match);

<强>输出:

Array
(
    [0] => <tr><td> one column </td><td>second column</td></tr>
    [1] => <tr><td> one column </td><td>second column</td></tr>
)

示例2:

$st = '<tr><td> one column </td><td>second column</td></tr><tr><td> one column </td><td>second column</td></tr>';
$match = array_unique(preg_split('[(<tr[^>]*>.*?</tr>)]',$st,NULL,PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY));
print_r($match);

<强>输出:

Array
(
    [0] => <tr><td> one column </td><td>second column</td></tr>
)

答案 1 :(得分:1)

请勿使用preg_split。你想使用preg_match_all:

preg_match_all('[<tr[^>]*>.*?</tr>]', $table, $matches, PREG_PATTERN_ORDER);
$rows = $matches[0];

但很少有问题:你为什么要使用array_unique?为什么要使用正则表达式解析HTML?请改用xpath之类的东西。