与[PHP]之间的标签一起爆炸字符串

时间:2018-07-17 09:40:11

标签: php arrays string explode

我有以下示例字符串:

$string = 'I wish you a merry <span style="font-size: 14px;">Christmas</span> and a happy new <span style="font-size: 18px;">year</span>!'

现在我正试图爆炸此字符串,以便输出为:

$arr[0] = 'I wish you a merry '
$arr[1] = '<span style="font-size: 14px;">Christmas</span>'
$arr[2] = ' and a happy new '
$arr[3] = '<span style="font-size: 18px;">year</span>'
$arr[4] = '!'

我尝试过

$arr = explode('<span style="font-size: ', $string);

但是,当然,我将整个字符串包括在内,直到下一个打开的<span>-Tag。

我还尝试将preg_match_all与foreach循环一起用于所有使用的字体大小:

preg_match_all('~\<span style="font-size:' . $fontSize . 'px;"\>(.*?)\<\/span\>~', $string, $output[$fontSize]);

但是不包括不在标签之间的其他字符串。但是我需要按照所述顺序进行操作。

如何将其正确转换为给定的数组?对于无法读取HTML的PHP​​库PDFlib,我需要它。

2 个答案:

答案 0 :(得分:3)

这是一个简单易读的解决方案(不是最漂亮的):

$string = 'I wish you a merry <span style="font-size: 14px;">Christmas</span> and a happy new <span style="font-size: 18px;">year</span>!';

$string = str_replace("<span", "|<span", $string);
$string = str_replace("</span>", "</span>|", $string);

字符串将最终如下所示:

'I wish you a merry |<span style="font-size: 14px;">Christmas</span>| and a happy new |<span style="font-size: 18px;">year</span>|!'

现在,您可以在“ |”上爆炸字符串:

$arr = explode("|", $string);

答案 1 :(得分:1)

您应使用该工具进行作业。这是使用DOMDocument做到这一点的方法(有一点技巧)。

$dom = new \DOMDocument();

$string = 'I wish you a merry <span style="font-size: 14px;">Christmas</span> and a happy new <span style="font-size: 18px;">year</span>!';
$dom->loadHTML("<div id='".($id=uniqid())."'>$string</div>"); //Trick, wrap in a div with a unique id.


foreach ($dom->getElementById($id)->childNodes as $child) { 
    echo $dom->saveHTML($child).PHP_EOL;
}

输出:

 I wish you a merry     
 <span style="font-size: 14px;">Christmas</span>    
  and a happy new     
 <span style="font-size: 18px;">year</span>    
 !

当然,除了echo $dom->saveHTML($child)之外,您还可以将结果放入数组中,例如$array[] = $dom->saveHTML($child);

Live example