Preg_split, как сохранить разделитель?

Я пытаюсь сохранить разделитель preg_split ( и ) без разделения его в новой позиции массива и не могу понять это. Так что любая помощь будет оценена.

Я пытаюсь взять каждую строку из следующего 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 ответа

Решение

Просто захватите также <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>
)

Не используйте preg_split для этого. Вы хотите использовать preg_match_all:

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

Несколько вопросов: зачем использовать array_unique? И почему вы хотите анализировать HTML с помощью регулярных выражений? Вместо этого используйте что-то вроде xpath.

Другие вопросы по тегам