使用preg_split()使用标签拆分文本

时间:2010-08-05 19:14:38

标签: php regex

我正在尝试拆分以下文字:

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

等通过以下注册例:

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

我得到了结果:testtest2作为结果,但我需要的是重新培训<word></word>标签,而不仅仅是测试和test2,我得到了另外4个带有匹配标签的元素。

如何做到这一点?

2 个答案:

答案 0 :(得分:2)

首先:使用解析器修改XML(SimpleXML DOM之类的内容可能适合你,具体取决于接下来采取的措施。

然而,为了争论:

preg_split(":(</?word>):",
    "<word>test</word><word>test2</word>",
    0,
    PREG_SPLIT_NO_EMPTY|PREG_SPLIT_DELIM_CAPTURE);

答案 1 :(得分:0)

首先,NEVER USE REGEX TO PARSE 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>"
}