用PHP从字符串的开头和结尾删除标签

3

我需要获取一个字符串,但不包含其开头和结尾的标签。我知道strip_tags函数可以去除所有标签,但不符合我的需求。例如:

<span class="note">
  <span></span>This is my text <strong>Hello world</strong> 
</span>

在这个例子中,我想保留标签。重要的是要知道我想要一个无条件的解决方案,因为标签可能不同。我已经知道您可以使用strip_tags来排除标签(这不是我想知道的),但这不是情况。

有人知道快速解决此问题的方法吗?例如,正则表达式替换或其他什么(我不擅长的事情)。在网上找不到这样的东西,所以我在这里问。

感谢您的贡献。

2个回答

3

DOMDocument 对此非常有用...

$dom = new DOMDocument;

$dom->loadHTML($html);

$html = '';

foreach($dom->getElementsByTagName('body')->item(0)->firstChild->childNodes as $node) {
    $html .= trim($dom->saveHTML($node));
}

echo $html;

CodePad

如果您坚定地想要使用正则表达式,您可以使用...

$html = preg_replace('/^\s*<[^>]+>\s*|\s*<\/[^>]+>\s*\z/', '', $html);

请注意,包含“>”的属性的HTML标签将导致正则表达式失败。 这就是为什么我更喜欢DOMDocument解决方案。
这两个解决方案都将剥离前导和尾随空白文本节点。 如果不需要,请从第一个示例中删除trim(),并从第二个示例中删除\s*

CodePad.


感谢您的快速回复。我不能使用DOMDocument,因为文档已经加载了,我不想再加载一次(内存),但也许我可以用它来解析片段。此外,正则表达式运行良好,除非在其前面添加一个空标签(例如<span> </span>)。当属性包含“>”时,无法工作并没有问题,这是一种糟糕编码的方式。但是,您能否更改它,以便还可以删除空的<span>?非常感谢! - Codebeat
尝试将/^\s*<[^>]+>\s*|\s*<\/[^>]+>\s*\z/替换为/^\s*<[^>]+>|<\/[^>]+>\s*\z/,我认为你会得到期望的结果? :) - tftd
已经被模板系统加载到内存中并完成了很多操作。这将成为自动将文档翻译成另一种语言的一部分。 - Codebeat
你应该得到 <span></span>这是我的文本 <strong>Hello world</strong>;http://codepad.viper-7.com/EO7NhE - tftd
是的,我知道,但我也想把<span></span>移除掉...只有带有标签的字符串。当一个字符串开始时,实际字符串之前和之后的每个标签都必须被移除... - Codebeat

0

谢谢,但这不是我想要的,似乎它与strip_tags做的一样,因为var_dump完全没有任何标记。 - Codebeat

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接