Regex替换以重新排序文本


Regex replace to reorder text

我有一个页面需要从DB输出文本,这个文本有时会通过iframe嵌入一个或多个视频。我需要输出这个,这样视频就会显示在文本的左边(通过css浮动)——尽管这需要将视频放在文本之前。

目前我有这个

$text = preg_replace("#(.*?)(<iframe.*?</iframe>)(.*?)#i", '$2 $1 $3', $text);

然而,这只会在多个iframe存在的情况下移动第一个,而将其他iframe留在原来的位置。

示例:

abcdefghijkl
<iframe....></iframe>
mnopqrstuvwxyz
<iframe....></iframe>

期望输出:

<iframe....></iframe>
<iframe....></iframe>
abcdefghijklmnopqrstuvwxyz

好吧,你可以使用preg_replace_callback来做这样的事情——这里有一个例子,但你将使用全局,这实际上是一个肮脏的解决方案:

$str = 'abcdefghijkl
<iframe....></iframe>
mnopqrstuvwxyz
<iframe....></iframe>';
global $myText;
global $myIframe;
preg_replace_callback("/([^<]+)(<iframe[^>]+>[^<]*<'/iframe>)/i",
            function($matches) use ($myText) {
                    global $myText, $myIframe;
                    $myText .= $matches[1];
                    $myIframe .= $matches[2]; 
            },
            $str);
echo $myIframe."<br>".$myText;