PHP:准确地将字符串按单词和标记分割成数组

3
任务是将字符串每500个字符拆分为数组。我已经用str_split实现了这一点,但出现了问题。当然,必须按单词拆分,否则这段文本就无法阅读。而且更重要的是,这段文本带有链接,如果我拆分它们(事实上任何html)=),链接将会损坏。所以我需要只在标签结束或甚至尚未开始时开始拆分... 单词也是如此。 ±100个字符不是问题。
我真的很感激能得到一段代码来做到这一点。我不太擅长正则表达式。
编辑:示例
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec ac diam non nisl interdum tempus. Nam id ipsum id nunc tempus varius. Suspendisse ut neque a velit elementum placerat. Curabitur lobortis, lorem sit <a href="#">amet tincidunt ultricies,</a> eros ante feugiat dui, sit amet lacinia metus risus a magna. Duis velit dui, sollicitudin at aliquet et, elementum at dui. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae;
脚本:
<?php

$str = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. <a href=\"http://example.com\">Phasellus condimentum
facilisis ipsum</a>, quis elementum urna ornare non. Cras nisi libero, dapibus sed euismod id, pharetra eu libero.
Maecenas mi nulla, ultrices in congue in, viverra ac massa. Quisque <br/>at turpis nulla. Suspendisse semper urna eu
augue aliquet dictum. Mauris at purus in lectus varius bibendum. <em>Fusce hendrerit <strong>posuere ante</strong></em>,
at pellentesque odio lobortis at. Integer quis urna eget ipsum dictum volutpat quis et leo. Etiam hendrerit eleifend
ornare. Phasellus eget justo elit.";

$str = str_split($str, 200);

var_dump($str);

输出:

    array(4) {
  [0]=>
  string(200) "Lorem ipsum dolor sit amet, consectetur adipiscing elit. <a href="http://example.com">Phasellus condimentum 
facilisis ipsum</a>, quis elementum urna ornare non. Cras nisi libero, dapibus sed euismod "
  [1]=>
  string(200) "id, pharetra eu libero. 
Maecenas mi nulla, ultrices in congue in, viverra ac massa. Quisque <br/>at turpis nulla. Suspendisse semper urna eu 
augue aliquet dictum. Mauris at purus in lectus varius bi"
  [2]=>
  string(200) "bendum. <em>Fusce hendrerit <strong>posuere ante</strong></em>, 
at pellentesque odio lobortis at. Integer quis urna eget ipsum dictum volutpat quis et leo. Etiam hendrerit eleifend 
ornare. Phasellus"
  [3]=>
  string(17) " eget justo elit."
}

这是一个严格的字符分割,一半的单词出现在 $str[1]。如果它恰好位于链接旁边,那么链接就会损坏。


你尝试过使用 explode(" ", $string) 吗? - Aston
我真的很感激一些样本数据 :) - Felix Kling
你真的需要保留HTML标签吗? - John Parker
稍微有些不同,但可以用与如何替换文本URL并排除HTML标签中的URL?相同的方法解决。如果你能提供一个示例输入和输出字符串,人们可能会更愿意帮助你。 - Gordon
编辑过的。每个数组元素就像一个“页码”来显示=)这就是我想要的。每一页都有正常可读的内容,没有破碎的HTML和分裂的单词。 - holms
2个回答


1
最好不要使用正则表达式来处理,而是使用PHP本身的XML/HTML解析能力。以下代码可能会实现你想要的功能:
<?php

$str = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. <a href=\"http://example.com\">Phasellus condimentum facilisis ipsum</a>, quis elementum urna ornare non. Cras nisi libero, dapibus sed euismod id, pharetra eu libero. Maecenas mi nulla, ultrices in congue in, viverra ac massa. Quisque <br/>at turpis nulla. Suspendisse semper urna eu augue aliquet dictum. Mauris at purus in lectus varius bibendum. <em>Fusce hendrerit <strong>posuere ante</strong></em>, at pellentesque odio lobortis at. Integer quis urna eget ipsum dictum volutpat quis et leo. Etiam hendrerit eleifend ornare. Phasellus eget justo elit.";

$dom = new DOMDocument;

$root = $dom->createDocumentFragment();
$root->appendXML($str);

$bits = array();

foreach ($root->childNodes as $node) {
    if ($node->nodeType == XML_TEXT_NODE) {
        $bits = array_merge($bits, explode(' ', $node->nodeValue));
    } elseif ($node->nodeType == XML_ELEMENT_NODE) {
        $dom->appendChild($newnode = $node->cloneNode(true));
        $bits[] = $dom->saveHTML();
        $dom->removeChild($newnode);
    }
}

var_dump($bits);

添加了一些示例,也许你可以修复你的代码,请注意 =) 顺便说一句,谢谢你提供这个示例 =) - holms

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