【问题标题】:Remove tags from the beginning and end of the string with PHP使用PHP从字符串的开头和结尾删除标签
【发布时间】:2012-02-12 23:24:57
【问题描述】:

我需要在字符串的开头和结尾获取一个没有标签的字符串。我知道strip_tags,但如您所知,它会删除所有标签。例如:

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

在这个例子中,我想保留&lt;strong&gt; 标签。重要的是要知道我想要一个无条件的解决方案,因为标签可能不同。我已经知道您可以使用 strip_tags 排除标签(这不是我想知道的),但事实并非如此。

有没有人知道一个快速的解决方案,例如 reg 表达式替换或其他东西(我不擅长的东西)。在网上找不到这样的东西,所以我在这里问它。

感谢您的贡献。

【问题讨论】:

    标签: php string tags


    【解决方案1】:

    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);
    

    CodePad.

    请注意,具有包含&gt; 属性的 HTML 标记会使正则表达式失败。这就是我更喜欢 DOMDocument 解决方案的原因。

    这两种解决方案都会去除前导和尾随空白文本节点。如果不希望这样做,请删除第一个示例中的 trim() 和第二个示例中的 \s*

    【讨论】:

    • 感谢您的快速答复。我不能使用 DOMDocument 因为文档已经加载并且我不想加载它两次(内存)但也许我可以用它来解析一个 sn-p。 reg 表达式也可以正常工作,除非您在它之前添加一个空标签(例如 )。当属性包含'>'时它不起作用是没有问题的,这是一种糟糕的编码方式。但是,您可以更改它以便删除空跨度吗?非常感谢!
    • 尝试将/^\s*&lt;[^&gt;]+&gt;\s*|\s*&lt;\/[^&gt;]+&gt;\s*\z/ 更改为/^\s*&lt;[^&gt;]+&gt;|&lt;\/[^&gt;]+&gt;\s*\z/,我想你会得到想要的结果吗? :)
    • 已经被模板系统加载到内存中并用它完成了分配工作。这将是自动将文档翻译成另一种语言的一部分。
    • 你应该得到&lt;span&gt;&lt;/span&gt;This is my text &lt;strong&gt;Hello world&lt;/strong&gt;codepad.viper-7.com/EO7NhE
    • 是的,我知道,但也希望 被删除....只有带有标签的字符串。当一个字符串开始时,必须删除实际字符串之前和之后的每个标签......
    【解决方案2】:

    我会使用一个简单的函数,而不是调用 DOM 类 - 它们运行速度较慢。
    这是我通常做的:http://codepad.viper-7.com/RVKmAG

    【讨论】:

    • 谢谢,但这不是我想要的,它似乎和 strip_tags 一样,因为 var_dump 完全没有任何标签。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-22
    • 1970-01-01
    • 2013-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多