PHP中移除XML字符串里的<br />标签
针对你遇到的XML内容每行末尾带<br />标签需要移除的问题,这里有两个实用的解决方案,结合你的WordPress场景给你整理一下:
移除XML内容每行末尾的
<br />标签方案 方法1:正则表达式精准匹配(适合简单场景)
如果你的XML里的<br />格式统一,且确实只出现在每行末尾,用正则可以快速解决。核心是利用多行模式匹配每行结尾的目标标签,不会影响其他位置的标签或内容。
示例代码
// 假设$xml_content是你从上传文件读取到的内容 // 精准匹配行尾的<br /> $xml_content = preg_replace('/<br \/>$/m', '', $xml_content); // 如果需要兼容<br>、<BR />这类变体,可以用更灵活的正则 $xml_content = preg_replace('/<br\s*\/?>$/mi', '', $xml_content);
- 正则说明:
m修饰符让$匹配每行末尾而非整个字符串末尾;i修饰符忽略大小写;\s*匹配可能的空格,\/?兼容自闭合和非自闭合的<br>标签。
方法2:DOMDocument处理(更健壮的结构化方案)
如果XML内容结构复杂,正则可能出现误匹配,用DOM解析会更稳妥——它会识别XML的结构化节点,精准定位并移除位于父元素末尾的<br>标签。
示例代码
$dom = new DOMDocument(); // 加载XML,LIBXML_NOERROR忽略轻微格式错误(避免解析失败) $dom->loadXML($xml_content, LIBXML_NOERROR); $brElements = $dom->getElementsByTagName('br'); // 倒序遍历,避免移除元素后索引混乱 for ($i = $brElements->length - 1; $i >= 0; $i--) { $br = $brElements->item($i); $parentNode = $br->parentNode; // 只移除作为父元素最后一个子节点的<br> if ($br === $parentNode->lastChild) { // 可选:如果<br>前有空白文本节点,也一并移除 $prevSibling = $br->previousSibling; if ($prevSibling && $prevSibling->nodeType === XML_TEXT_NODE && trim($prevSibling->nodeValue) === '') { $parentNode->removeChild($prevSibling); } $parentNode->removeChild($br); } } // 转换回字符串 $xml_content = $dom->saveXML();
结合你的WordPress函数示例
把处理逻辑插入到你提交函数的“读取XML内容后、插入文章前”的环节:
function slicer_profile_submit() { if (isset($_POST['slicer_submit'])) { // 替换成你的实际提交按钮名 // 读取上传的XML文件内容 $xml_file = $_FILES['xml_upload']['tmp_name']; $xml_content = file_get_contents($xml_file); // 选择上面的一种方法处理内容 // 方法1正则处理示例: $xml_content = preg_replace('/<br \/>$/m', '', $xml_content); // 插入到WordPress文章 $post_args = array( 'post_title' => '导入的XML文章', 'post_content' => $xml_content, 'post_status' => 'publish', 'post_type' => 'post' ); wp_insert_post($post_args); } }
内容的提问来源于stack exchange,提问作者Aidan Knight
相关产品推荐
相关产品推荐

