Разделение текста с тегами с помощью preg_split () - PullRequest
0 голосов
/ 05 августа 2010

Я пытаюсь разбить следующий текст:

<word>test</word><word>test2</word>

и т. Д. Через следующий регистр ex:

preg_split(":</?word>:is", $html);

Я получаю результат: test и test2 как результат, но мне нужно переобучить теги <word> и </word>, поэтому вместо просто test и test2 я получаю еще 4 элемента соответствующие теги в них.

Как это можно сделать?

Ответы [ 2 ]

2 голосов
/ 05 августа 2010

Прежде всего: используйте синтаксический анализатор для изменения XML (что-то вроде SimpleXML из DOM может подойти вам хорошо, в зависимости от действий, предпринятых далее).

Однако, ради аргумента:

preg_split(":(</?word>):",
    "<word>test</word><word>test2</word>",
    0,
    PREG_SPLIT_NO_EMPTY|PREG_SPLIT_DELIM_CAPTURE);
0 голосов
/ 05 августа 2010

Во-первых, НИКОГДА НЕ ИСПОЛЬЗУЙТЕ РЕГЕКС ДЛЯ РАЗДЕЛЕНИЯ HTML ..

Но чтобы решить вашу проблему, посмотрите на флаги для preg_split()

preg_split(
    ":(</?word>):is", 
    $html, 
    -1, 
    PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY
);

Теперь он разделит их и даст вам следующее:

array(7) {
  [0]=>
  string(6) "<word>"
  [1]=>
  string(4) "test"
  [2]=>
  string(7) "</word>"
  [3]=>
  string(2) ", "
  [4]=>
  string(6) "<word>"
  [5]=>
  string(5) "test2"
  [6]=>
  string(7) "</word>"
}

Все еще не годится. Но, что мы можем сделать, это перебрать массив и переместить <word> в следующий буфер, а </word> в предыдущий ...

$buffer = '';
$newWords = array();
foreach ($words as $word) {
    if (strcasecmp($word, '<word>') === 0) {
        $buffer .= $word;
    } elseif (strcasecmp($word, '</word>') === 0) {
        // Find the last buffer
        $last = end($newWords);
        $newWords[key($newWords)] = $last . $buffer . $word;
        $buffer = '';
    } else {
        $newWords[] = $buffer . $word;
        $buffer = '';
    }
}
if (!empty($buffer)) {
    $newWords[] = $buffer;
}

Что даст вам:

array(3) {
  [0]=>
  string(17) "<word>test</word>"
  [1]=>
  string(2) ", "
  [2]=>
  string(18) "<word>test2</word>"
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...