gpt4 book ai didi

php - 正则表达式 : Converting non-block elements with
to

in PHP

转载 作者:可可西里 更新时间:2023-10-31 22:58:26 25 4
gpt4 key购买 nike

有人问了 similar question ,但接受的答案不符合我的要求。

输入:

<strong>bold <br /><br /> text</strong><br /><br /><br />
<a href="#">link</a><br /><br />
<pre>some code</pre>
I'm a single br, <br /> leave me alone.

预期输出:

<p><strong>bold <br /> text</strong><br /></p>
<p><a href="#">link</a><br /></p>
<pre>some code</pre>
<p>I'm a single br, <br /> leave me alone.</p>

我上面提到的接受的答案将多个 br 转换为 p,最后用另一个 p 包装所有输入。但就我而言,您不能将 pre 包装在 p 标签内。谁能帮忙?

更新

此编辑之前的预期输出有点令人困惑。重点是:

  1. 将多个 br 转换为一个(使用 preg_replace('/(<br />)+/', '<br />', $str); 实现)

  2. 检查内联元素和未包装的文本(在这种情况下没有父元素,输入来自 $_POST)并使用

    包装,单独保留 block 级元素。

最佳答案

不要使用正则表达式。为什么?请参阅:RegEx match open tags except XHTML self-contained tags

使用适当的 DOM 操纵器。请参阅:http://php.net/manual/en/book.dom.php

编辑:我不太喜欢提供食谱,所以这里有一个更改双 <br /> 的解决方案到包裹在 <p></p> 中的文本:

script.php:
<?php

function isBlockElement($nodeName) {
$blockElementsArray = array("pre", "div"); // edit to suit your needs
return in_array($nodeName, $blockElementsArray);
}

function hasBlockParent(&$node) {
if (!($node instanceof DOMNode)) {
// return whatever you wish to return on error
// or throw an exception
}
if (is_null($node->parentNode))
return false;

if (isBlockElement($node->parentNode))
return true;

return hasBlockParent($node->parentNode);
}

$myDom = new DOMDocument;
$myDom->loadHTMLFile("in-file");
$myDom->normalizeDocument();


$elems =& $myDom->getElementsByTagName("*");
for ($i = 0; $i < $elems->length; $i++) {
$element =& $elems->item($i);
if (($element->nextSibling->nodeName == "br" && $element->nextSibling->nextSibling->nodeName == "br") && !hasBlockParent($element)) {
$parent =& $element->parentNode;
$parent->removeChild($element->nextSibling->nextSibling);
$parent->removeChild($element->nextSibling);

// check if there are further nodes on the same level
$nSibling;
if (!is_null($element->nextSibling))
$nSibling = $element->nextSibling;
else
$nSibling = NULL;

// delete the old node
$saved = $parent->removeChild($element);
$newNode = $myDom->createElement("p");
$newNode->appendChild($saved);
if ($nSibling == NULL)
$parent->appendChild($newNode);
else
$parent->insertBefore($newNode, $nSibling);
}
}

$myDom->saveHTMLFile("out-file");

?>

这并不是真正的完整解决方案,但它是一个起点。这是我在午休期间能写出的最好的作品,请记住,我上一次用 PHP 编写代码是大约 2 年前(从那以后我主要使用 C++)。我不是把它写成一个完整的解决方案,而是给你一个......好吧,起点 :)

无论如何,输入文件:

[dare2be@schroedinger dom-php]$ cat in-file
<strong>bold <br /><br /> text</strong><br /><br /><br />
<a href="#">link</a><br /><br />
<pre>some code</pre>
I'm a single br, <br /> leave me alone.

输出文件:

[dare2be@schroedinger dom-php]$ cat out-file 
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<html><body><p><strong>bold <br><br> text</strong></p><br><p><a href="#">link</a></p><pre>some code</pre>
I'm a single br, <br> leave me alone.</body></html>

整体DOCTYPE胡言乱语是一种副作用。该代码不会执行您所说的其余内容,例如更改 <bold><br><br></bold><bold><br></bold> .此外,整个脚本是一个快速草稿,但您会明白这一点。

关于php - 正则表达式 : Converting non-block elements with <br/> to <p> in PHP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7277404/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com