【问题标题】:PHP: Accurate string splitting by words and tags into arrayPHP:按单词和标签将字符串准确拆分为数组
【发布时间】:2011-01-09 10:59:39
【问题描述】:

任务是将字符串按 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) 吗?
  • 我非常感谢一些示例数据 :)
  • 真的需要保持HTML标签完整吗?
  • 略有不同,但可以使用与How to replace text URLs and exclude URLs in HTML tags? 相同的方法解决。如果您可以提供示例输入和输出字符串,人们可能更愿意提供帮助。
  • 已编辑。每个数组元素都像要显示的“页码” =) 这就是我想要的。每个页面上的正常可读内容,没有损坏的 html 和拆分的半字。

标签: php


【解决方案1】:
【解决方案2】:

最好不要使用正则表达式,而是使用 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);

【讨论】:

  • 添加了一些例子,也许你可以修复你的代码=)谢谢你这个例子顺便说一句=)
猜你喜欢
  • 1970-01-01
  • 2011-10-23
  • 2010-09-26
  • 1970-01-01
  • 1970-01-01
  • 2018-04-12
  • 1970-01-01
相关资源
最近更新 更多