取一个大文本的一部分

Posted

技术标签:

【中文标题】取一个大文本的一部分【英文标题】:Take a part of a big text 【发布时间】:2011-08-11 04:11:34 【问题描述】:

假设我们有一个字符串 ($text)

I will help you out, if <b>you see this message and never forget</b> blah blah blah

我想将文本从 "&lt;b&gt;" 到 "&lt;/b&gt;" 转换成一个新字符串($text2) 如何做到这一点?

感谢我能得到的任何帮助。谢谢!

编辑: 我想要这样的代码。

<embed type="application/x-shockwave-flash"></embed>

【问题讨论】:

Extract DOM-elements from string, in php. 的可能重复项 我的答案有一个完整的使用DOMDocument的例子 【参考方案1】:
strip_tags($text, '<b>');

将只提取&lt;b&gt; &lt;/b&gt;之间的字符串部分

如果这是您寻找的行为。

【讨论】:

不幸的是,这将返回字符串中不属于 php 或 html 标记(或 NUL 字符)的所有文本。他正在寻找的只是获取 s 的内部内容【参考方案2】:

使用这个糟糕的 mofo:http://fr2.php.net/domdocument

$dom = new DOMDocument();
$dom->loadHTML($text);

$xpath = new DOMXpath($dom);
$nodes = $xpath->query('//b');

在这里,您可以循环遍历每一个,或者如果您知道只有一个,则只需获取值。

$text1 = $nodes->item(0)->nodeValue;

【讨论】:

值得注意的是,文本需要是有效的dom内容,否则xpath会对你、你的字符串、你的程序、你的用户和你的虚拟主机生气 Adam@ 我收到此错误“调用未定义函数 loadHTML()” 感谢您的帮助。这也适用于嵌入代码吗? 哈哈,我的坏 Muazam。我白天是一个 Java 人,这就是我写 $dom.loadHTML 的原因,而它应该是 $dom->loadHTML。您绝对应该在选定的方法上使用这种方法,因为它完全是面向对象的,而且简短易懂【参考方案3】:

如果您只希望第一次匹配并且不想匹配&lt;b class="&gt; 之类的内容,则可以使用以下方法:

更新评论:

$text = "I will help you out, if <b>you see this message and never forget</b> blah blah blah";
$matches = array();
preg_match('@<b>.*?</b>@s', $text, $matches);
if ($matches) 
    $text2 = $matches[0];
    // Do something with $text2

else 
    // The string wasn't found, so do something else.

但是对于更复杂的事情,您确实应该按照 Marc B. 的评论将其解析为 DOM。

【讨论】:

我收到这个错误“未定义的偏移量:0”有什么想法吗?在线“$text2 = $matches[0];” 是的,你的 $text 字符串显然没有&lt;b&gt;....&lt;/b&gt;。您可以使用我上面更新的示例进行尝试(该示例还通过正确检查是否找到任何匹配项来处理偏移问题)。 谢谢,它成功了。但你认为我也能得到标签吗?并获得类似嵌入标签的东西?非常感谢! 对于嵌入,只需执行与上述相同的操作,但用“嵌入”替换每次使用的“b”。我不确定你想要标签的方式,但似乎你需要阅读更多关于正则表达式和 preg_match 的内容,以便你可以根据需要制作它们。上面显示了一般方法。祝你好运! 太棒了!感谢代码工作的帮助!非常感谢,非常感谢!

以上是关于取一个大文本的一部分的主要内容,如果未能解决你的问题,请参考以下文章

易语言如何取剪切板中的部分文本?

爬虫大作业

爬虫大作业之广商足球快讯(爬取足球新闻)

自学C#记录—文本操作—取出现次数

Qt - 在大文本缓冲区中滚动

爬虫大作业