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>