preg_replace regex,将字符串拆分为数组

时间:2013-11-29 21:27:09

标签: php regex

我有一个字符串,我需要将一些值拆分成一个数组,最好的方法是什么?

字符串可以如下所示:

<span class="17">118</span><span style="display: inline">.</span><span style="display:none"></span>

125<span class="17">25</span>354

规则是:

  1. 字符串可以以数字开头,后跟span或div
  2. 字符串可以以span或div开头
  3. 字符串可以以数字
  4. 结尾
  5. 字符串可以以/ span或/ div
  6. 结尾
  7. div / span可以有样式/类
  8. 我需要的是分离字符串,以便我将元素分开,例如:

    0 => 123
    1 => <span class="potato">123</span>
    2 => <span style="color: black">123</span>
    

    我尝试了一些costum regex,但正则表达式并不是我强大的一面:

    $pattern = "/<div.(.*?)<\/div>|<span.(.*?)<\/span>/";
    // i know it wont detect a number value prior to the div, thats also an issue, even if it worked
    

    我不能使用simple_html_dom来完成REGEX。

    在每个&gt;&lt;之间拆分字符串可能会有效,但“&gt;(。*?)&lt;” &lt;&lt;出于某种原因?

2 个答案:

答案 0 :(得分:0)

如果你只是将这个字符串加载到DOM然后手动解析它编程你的逻辑,你可能会获得更好的性能:

var el = document.createElement( 'div' );
el.innerHTML = '125<span class="17">25</span>354';

// test your first element (125) index=0 (you can make for loop)
if(el.childNodes[0].nodeType == 3) alert('this is number first, validate it');
else if(el.childNodes[0].nodeType == 1) alert('this is span or div, test it');
// you can test for div or span with el.childNodes[0].nodeName

// store first element to your array

// then continue, test el.childNodes[next one, index=1 (span)...]
// then continue, test el.childNodes[next one, index=2 (354)...]

因为你已经知道你在寻找,这可以就是那么简单

答案 1 :(得分:0)

尝试/(<(span|div)[^>]*>)*([^<]*)(<\/(span|div)>)*/

正则表达式中说'可能有一个跨度或div或者什么都没有,然后它必须是/ span或/ div或者什么都没有,并且整个语句可以匹配零次或多次。

这是一个例子:     

$pattern = "/(<(span|div)[^>]*>)*([^<]*)(<\/(span|div)>)*/";

$txt = '<span class="17">118</span><span style="display: inline">.</span><span style="display:none"></span>';
preg_match_all($pattern, $txt,$foo);
print_r($foo[0]);

$txt = '125<span class="17">25</span>354';
preg_match_all($pattern, $txt,$foo);
print_r($foo[0]);
?>