Preg_replace в PHP... заменить и заполнить текст между тегами

Это мой код: <span>C</span> <span>F</span> <span>D</span> Hello, this is a text from me. Song's lyric, I need to fix <span>D </span> <span>E</span>

будет выполняться из $text, а затем будет выполняться preg_replace. и текст $ будет размещен в:

<pre>$text</pre>

Чтобы показать, как это:

<span>C</span>         <span>F</span>                <span>D</span>
Hello, this is a text from me. Song's lyric, I need to fix
<span>D</span>      <span>E</span>

Я пытался использовать:

$text=preg_replace("/<\/span>[a-zA-Z0-9\.\?\'\"\!\@\&\s\(\)\[\]\-\_\+\=]{8}\s+/","<br></span>$1$2",$text);

Но результат:

<span>C<br></span><span>F<br></span> ...

Пожалуйста, помогите мне в этом... >_<потратьте как часы, чтобы сделать это, ик Если есть другой способ не использовать preg_replace, пожалуйста, покажите мне тоже.

1 ответ

Решение

Для дальнейшего ознакомления я решил опубликовать то, что придумал, когда решал эту задачу с использованием PHP DOM-парсера.

Я мог бы добавить, что это несколько сбивает с толку, что все "настоящие" узлы на самом деле находятся в NodeList не элемента документа, а NodeList первого дочернего элемента документа (то есть docElem -> first child -> children вместо docElement -> дети).

<?php
$str = '<span>f</span> <span>d</span> my text here lololol <span>t</span> <span>ok</span> dwa dawmo pgse gmspg mse <span>d</span>';

$doc = new DOMDocument();
$doc->loadHTML($str);
$docElem = $doc->documentElement;
$children = $docElem->childNodes->item(0)->childNodes;

    for ($i = 0, $len = $children->length; $i<$len; $i++)
    {
        $node = $children->item($i);
        $val = trim($node->nodeValue);

            // text
            if (is_a($node, 'DOMText') && $val) {
                echo "<br />\r\n" . $val . "<br />\r\n";
            // span
            } else if ($node->tagName == 'span') {
                echo '<'. $node->tagName .'>' . $val . '</'. $node->tagName .'>';
            // whitespace
            } else {
                echo $node->nodeValue;
            }
    }

?>

Это выведет:

f d
my text here lololol
t ok
dwa dawmo pgse gmspg mse
d

конечно, с HTML-элементами:

<span>f</span> <span>d</span><br />
my text here lololol<br />
<span>t</span> <span>ok</span><br />
dwa dawmo pgse gmspg mse<br />
<span>d</span>
Другие вопросы по тегам