Php 使用preg_split()拆分带有标记的文本

Php 使用preg_split()拆分带有标记的文本,php,regex,Php,Regex,我正在尝试拆分以下文本: test2 etc通过以下reg ex: preg_split(":</?word>:is", $html); preg_split(“::is”,$html); 我得到的结果是:test和test2作为结果,但我需要的是重新训练和标记,所以我不只是得到test和test2,而是得到另外4个元素,其中包含匹配的标记 如何做到这一点?首先:使用解析器修改XML(类似于DOM的SimpleXML可能很适合您,具体取决于接下来采取的操作) 然而,为了论证起见:

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

test2

etc通过以下reg ex:

preg_split(":</?word>:is", $html);
preg_split(“::is”,$html);
我得到的结果是:
test
test2
作为结果,但我需要的是重新训练
标记,所以我不只是得到test和test2,而是得到另外4个元素,其中包含匹配的标记


如何做到这一点?

首先:使用解析器修改XML(类似于
DOM
SimpleXML
可能很适合您,具体取决于接下来采取的操作)

然而,为了论证起见:

preg_split(":(</?word>):",
    "<word>test</word><word>test2</word>",
    0,
    PREG_SPLIT_NO_EMPTY|PREG_SPLIT_DELIM_CAPTURE);
preg_split(“:():”,
“测试2”,
0,
PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE);
首先

但要解决您的问题,请查看

preg\u split(
“:():是”,
$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>"
}
数组(7){
[0]=>
字符串(6)”
[1]=>
字符串(4)“测试”
[2]=>
字符串(7)”
[3]=>
字符串(2)“,”
[4]=>
字符串(6)”
[5]=>
字符串(5)“test2”
[6]=>
字符串(7)”
}
还是不行。但是,我们可以做的是,在数组上循环,并将
移动到下一个缓冲区,将
移动到上一个缓冲区

$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;
}
$buffer='';
$newWords=array();
foreach($words作为$word){
if(strcasecmp($word,')==0){
$buffer.=$word;
}elseif(strcasecmp($word',)==0){
//找到最后一个缓冲区
$last=end($newWords);
$newWords[关键字($newWords)]=$last.$buffer.$word;
$buffer='';
}否则{
$newWords[]=$buffer.$word;
$buffer='';
}
}
如果(!空($buffer)){
$newWords[]=$buffer;
}
这将给你:

array(3) {
  [0]=>
  string(17) "<word>test</word>"
  [1]=>
  string(2) ", "
  [2]=>
  string(18) "<word>test2</word>"
}
数组(3){
[0]=>
字符串(17)“测试”
[1]=>
字符串(2)“,”
[2]=>
字符串(18)“test2”
}

使用
的是
修饰符;如果他们不只是复制/粘贴问题,我会投票。啊,是的,完全没有必要。我会把它们删掉。(我记得几年前开始使用正则表达式时,我几乎按默认值键入了
/six
),此时我只是懒洋洋的c/p-ing,当然……:P)这是您的投票,感谢您纵容了一位易怒的正则表达式作者。:-)@OZZIE:因此,请关注答案的第一部分(使用类似于
simpleXML
DOM
,或任何其他实际的XML库…)。另一个答案中链接了一个背景:
array(3) {
  [0]=>
  string(17) "<word>test</word>"
  [1]=>
  string(2) ", "
  [2]=>
  string(18) "<word>test2</word>"
}