PHP-php分解字符串
abc<span>bcd</span>feieu<span>yy</span>feie
我有如上字符串,里面的span可能有0个或者多个,
我想要将如上字符串转为数组,也就是通过span标签进行分割,但分割方式有些特殊
最终生成的数组格式如下:
{
abc,
<span>bcd</span>,
feieu,
<span>yy</span>,
feie
}
有什么好的处理方法吗?
2013-5-31 11:25补充,数组中的字符串需要存在顺序
2013-5-31 12:03补充,如果字符串<font>abc</font>aaa<span>bcd</span>feieu<span>yy</span>feie
处理后
结果为:
{
<font>abc</font>aaa,
<span>bcd</span>,
feieu,
<span>yy</span>,
feie
}
也就是除<span>外的其他标签被当做正常字符串
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
<?php
$a = 'abc<span>bcd</span>feieu<span>yy</span>feie';
$reg = '#((?:(?<!<span>)[^<]+(?!</span>))|(?:<span>.+?</span>))#';
$matches = array();
preg_match_all($reg, $a, $matches);
print_r($matches);
更新:
关于为什么有2个记录?
第一个记录是正则的完全匹配内容
第二个记录的是第一个括号捕获的内容
如果正则表达匹配的内容和捕获的内容不一样,就能看出区别了
例如
$a = 'abcdabcdabe';
$reg = '/(ab)c/';
$matches = array();
preg_match_all($reg, $a, $matches);
print_r($matches);
其实如果不追求特别严谨的话,这样也是可以的
$reg = '#((?:[^<]+)|(?:<span>.+?</span>))#';
加上括号的目的是为了让局部保持整体,和不加括号的意思不一样
如果对数组排列顺序没有特别要求的话可以分两步来完成。
首先按<sapn>.+?</span>正则全匹配得到是(<sapn>...</span>)形式的字串数组A,
然后按<sapn>.+?</span>进行分割得到不是(<span>....</span>)串的一个数组B。
最后合并数组A,B(array_merge(A,B)),应该就是你要的结果了。
具体代码如下。
<?php
$str = 'abc<span>bcd</span>feieu<span>yy</span>feie';
$reg = '#<span>(.+?)</span>#';
$A = array();
$B = array();
preg_match_all($reg,$str,$match_arr);
//print_r($match_arr);
$A = $match_arr[0];
$B= preg_split($reg,$str);
//print_r($B);
$res_arr = array_merge($A,$B);
print_r($res_arr);
?>