<document page-count="3">
<page number="1">
<table id="p1" data-page="1" data-table="1">>>>(2016-05-20)<<< >>>(name)<<< >>>(cat)<<< </table>
</page>
<page number="2">
<table id="p2" data-page="1" data-table="1">>>>(2016-05-20)<<< >>>(name)<<< >>>(cat)<<< </table>
</page>
<page number="3">
<table id="p3" data-page="1" data-table="1">>>>(2016-05-20)<<< >>>(name)<<< >>>(cat)<<< </table>
</page>
我希望该代码能够回显出&gt;&gt;&gt;的每个“孩子”。和&lt;&lt;&lt;例如cat
。
我一直在使用str_replace
来减少每个不必要的文本。
我希望以上更像:
<row>
<date>2016-05-30</date>
<name>name</name>
<animal>cat</animal>
</row>
我得到“(”和“)”的原因是因为某些“行”会有多个值。
我正在寻找一种简单的方法来做到这一点!
答案 0 :(得分:0)
$str = '<document page-count="3">
<page number="1">
<table id="p1" data-page="1" data-table="1">>>>(2016-05-20)<<< >>>(name)<<< >>>(cat)<<< </table>
</page>
<page number="2">
<table id="p2" data-page="1" data-table="1">>>>(2016-05-20)<<< >>>(name)<<< >>>(cat)<<< </table>
</page>
<page number="3">
<table id="p3" data-page="1" data-table="1">>>>(2016-05-20)<<< >>>(name)<<< >>>(cat)<<< </table>
</page>';
// if you do not have () around the values use this pattern: /(\d{4}-\d{2}-\d{2}).*(\w+).*(\w+)/
// your text seem to indicate that it doesn't have () around the values
preg_match_all("/\((\d{4}-\d{2}-\d{2})\).*\((\w+)\).*\((\w+)\)/",$str,$match);
// preg_match_all("/\((\d{4}-\d{2}-\d{2})\).*\((\w+)\).*\((\w+)\)/",strip_tags($str),$match);
var_dump($match);
结果:
array(4) {
[0]=>
array(3) {
[0]=> string(37) "(2016-05-20)<<< >>>(name)<<< >>>(cat)"
[1]=> string(37) "(2016-05-20)<<< >>>(name)<<< >>>(cat)"
[2]=> string(37) "(2016-05-20)<<< >>>(name)<<< >>>(cat)"
}
[1]=>
array(3) {
[0]=> string(10) "2016-05-20"
[1]=> string(10) "2016-05-20"
[2]=> string(10) "2016-05-20"
}
[2]=>
array(3) {
[0]=> string(4) "name"
[1]=> string(4) "name"
[2]=> string(4) "name"
}
[3]=>
array(3) {
[0]=> string(3) "cat"
[1]=> string(3) "cat"
[2]=> string(3) "cat"
}
}
但这是关于HTML的正则表达式,它可能会导致问题 如果你使用strip_tags()它会更安全但是在我的测试字符串上它不能正常工作,因为所有字符串都聚集在一行中。他们不应该那样做 我建议你首先尝试使用strip_tags。它可能是我的测试字符串上的换行错误。
http://sandbox.onlinephpfunctions.com/code/387951bce623573259b81745942c86dd828306db
编辑:抱歉,我忘记了你想要的结果:
http://sandbox.onlinephpfunctions.com/code/06ed1f8075b17af08daf0843f4ba8b1066405da6
$str = '<document page-count="3">
<page number="1">
<table id="p1" data-page="1" data-table="1">>>>(2016-05-20)<<< >>>(name)<<< >>>(cat)<<< </table>
</page>
<page number="2">
<table id="p2" data-page="1" data-table="1">>>>(2016-05-20)<<< >>>(name)<<< >>>(cat)<<< </table>
</page>
<page number="3">
<table id="p3" data-page="1" data-table="1">>>>(2016-05-20)<<< >>>(name)<<< >>>(cat)<<< </table>
</page>';
preg_match_all("/\((\d{4}-\d{2}-\d{2})\).*\((\w+)\).*\((\w+)\)/",$str,$match);
//preg_match_all("/\((\d{4}-\d{2}-\d{2})\).*\((\w+)\).*\((\w+)\)/",strip_tags($str),$match);
$newstr= "";
for($i=0;$i<=count($match[0])-1;$i++){
$newstr .= "<row>
<date>" . $match[1][$i] ."</date>
<name>" . $match[2][$i] ."</name>
<animal>".$match[3][$i] ."</animal>
</row>
";
}
echo $newstr;
答案 1 :(得分:0)
试试这个: -
$str = '<document page-count="3">
<page number="1">
<table id="p1" data-page="1" data-table="1">>>>(2016-05-20)<<< >>>(name)<<< >>>(cat1)<<< </table>
</page>
<page number="2">
<table id="p2" data-page="1" data-table="1">>>>(2016-05-21)<<< >>>(name1)<<< >>>(cat2)<<< </table>
</page>
<page number="3">
<table id="p3" data-page="1" data-table="1">>>>(2016-05-22)<<< >>>(name2)<<< >>>(cat3)<<< </table>
</page>';
preg_match_all('/>>>\((.*?)\)<<</', $str, $matches);
$res = array_chunk($matches[1], 3);
echo '<pre>'; print_r($res);
<强>输出: - 强>
Array
(
[0] => Array
(
[0] => 2016-05-20
[1] => name
[2] => cat1
)
[1] => Array
(
[0] => 2016-05-21
[1] => name1
[2] => cat2
)
[2] => Array
(
[0] => 2016-05-22
[1] => name2
[2] => cat3
)
)
要符合您的要求,请添加以下代码: -
$str = '';
foreach($res as $v){
$str .= '<row>';
$str .= "<date>{$v[0]}</date>";
$str .= "<name>{$v[1]}</name>";
$str .= "<animal>{$v[2]}</animal>";
$str .= '</row>';
}
echo $str;
<强>输出强>: -
<row>
<date>2016-05-20</date>
<name>name</name>
<animal>cat1</animal>
</row>
<row>
<date>2016-05-21</date>
<name>name1</name>
<animal>cat2</animal>
</row>
<row>
<date>2016-05-22</date>
<name>name2</name>
<animal>cat3</animal>
</row>