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>"
}