如何有条件地从字符串中删除内容?

时间:2018-11-10 01:43:37

标签: php

我有一个功能可以创建这样的帖子的预览

<?php $pos=strpos($post->content, ' ', 280);
echo substr($post->content,0,$pos ); ?>

但是,该帖子中的第一件事很可能是<style>块。我该如何创建一些条件逻辑,以确保我的预览写在样式块的之后?

3 个答案:

答案 0 :(得分:1)

如果,唯一的HTML内容是regex_t regex_s, regex_i, regex_p; int reti_s = regcomp(&regex_s, "[a-z A-Z]+", REG_EXTENDED); . . . reti_s = regexec(&regex_s, cmd[1], 0, NULL, 0); 标记,则只需使用<style>

preg_replace

不过,最好使用echo preg_replace('#<style>.*?</style>#', '', $post->content); (注意DOMDocument会在您的帖子内容周围放置一个loadHTML标签,这是我们要搜索的内容)(更可靠)只是其中包含的文字:

<body>

对于此示例输入:

$doc = new DOMDocument();
$doc->loadHTML($post->content);
echo $doc->getElementsByTagName('body')->item(0)->nodeValue . "\n";

两者的输出是

$post = (object)['content' => '<style>some random css</style>the text I really want'];

Demo on 3v4l.org

答案 1 :(得分:0)

从@deceze的出色评论中获得线索,这是在PHP中使用DOM消除样式标签的一种方法:

<?php

$_POST["content"] = 
"<style>
color:blue;
</style>
The rain in Spain lies mainly in the plain ...";

$dom = new DOMDocument;
$dom->loadHTML($_POST["content"]);
$style_tags = $dom->GetElementsByTagName('style');

foreach($style_tags as $style_tag) {

  $prent = $style_tag->parentNode;
  $prent->replaceChild($dom->createTextNode(''), $style_tag);

}

echo strip_tags($dom->saveHTML());


参见演示here

我还从相关讨论中获得了指导,特别是officially accepted answer

使用DOM处理PHP的优点是,您甚至不需要创建条件来删除STYLE标记。另外,您正在使用HTML元素,因此您不必担心使用正则表达式的复杂性。请注意,在替换样式标签时,它们将被包含空字符串的文本节点替换。

注意,当DOM对象执行其saveHTML()方法时,将自动插入诸如HEAD和BODY之类的标签。因此,为了仅显示文本内容,最后一行使用strip_tags()删除所有HTML标记。

最后,虽然通常接受的答案通常是可行的选择,但对于包含BODY标签之后的STYLE标签 的不兼容HTML,它不能提供完整的解决方案。

答案 2 :(得分:-3)

您有两个选择。

  1. 如果您的内容中没有标签,请使用strip_tags()
  2. 您可以使用正则表达式。这比较复杂,但始终有合适的模式。 e.g. preg_match()