如何使用PHP计算HTML代码的行数?

如何使用PHP计算HTML代码的行数?,php,html,regex,simplexml,Php,Html,Regex,Simplexml,我有一些由所见即所得编辑器(WordPress)生成的HTML。 我想通过最多显示3行文本(HTML格式)来显示此HTML的预览 示例HTML:(始终使用新行格式化) 你好,这是一些生成的HTML 某些列表项 一些列表项 一些列表项 我想在这个格式化的HTML中预览最多4行文本 要显示的预览示例:(数字表示行号,而不是实际输出) 您好,这是一些生成的HTML 一些列表项 一些列表项 这在正则表达式中是可能的,还是我可以使用其他方法? 我知道,正如我所质疑和回答的那样,用JavaScript以

我有一些由所见即所得编辑器(WordPress)生成的HTML。
我想通过最多显示3行文本(HTML格式)来显示此HTML的预览

示例HTML:(始终使用新行格式化)

你好,这是一些生成的HTML

  • 某些列表项
  • 一些列表项
  • 一些列表项
  • 我想在这个格式化的HTML中预览最多4行文本

    要显示的预览示例:(数字表示行号,而不是实际输出)

  • 您好,这是一些生成的HTML
  • 一些列表项
  • 一些列表项
  • 这在正则表达式中是可能的,还是我可以使用其他方法?
    我知道,正如我所质疑和回答的那样,用JavaScript以“黑客”的方式实现这一点是可能的。

    但是我想纯粹在服务器端(使用PHP)实现这一点,可能使用SimpleXML?

    使用XPath非常简单:

    $string = '<p>Hello, this is some generated HTML.</p>
        <ol>
            <li>Some list item</li>
            <li>Some list item</li>
            <li>Some list item</li>
        </ol>';
    
    // Convert to SimpleXML object
    // A root element is required so we can just blindly add this
    // or else SimpleXMLElement will complain
    $xml = new SimpleXMLElement('<root>'.$string.'</root>');
    
    // Get all the text() nodes
    // I believe there is a way to select non-empty nodes here but we'll leave that logic for PHP
    $result = $xml->xpath('//text()');
    
    // Loop the nodes and display 4 non-empty text nodes
    $i = 0;
    foreach( $result as $key => $node )
    {
        if(trim($node) !== '')
        {
            echo ++$i.'. '.htmlentities(trim($node)).'<br />'.PHP_EOL;
            if($i === 4)
            {
                break;
            }
        }
    }
    
    $string='您好,这是一些生成的HTML

  • 一些列表项
  • 一些列表项
  • 一些列表项
  • '; //转换为SimpleXML对象 //一个根元素是必需的,所以我们可以盲目地添加它 //否则SimpleXMLElement会抱怨 $xml=新的SimpleXMLElement('.$string'.'); //获取所有text()节点 //我相信这里有一种选择非空节点的方法,但我们将把这种逻辑留给PHP $result=$xml->xpath('//text()'); //循环节点并显示4个非空文本节点 $i=0; foreach($结果为$key=>$node) { 如果(修剪($node)!='') { echo++$i.'.htmlentities(trim($node)).
    '.PHP_EOL; 如果($i==4) { 打破 } } }
    输出:

    1. Hello, this is some generated HTML.<br />
    2. Some list item<br />
    3. Some list item<br />
    4. Some list item<br />
    
    1。您好,这是一些生成的HTML。
    2.某些列表项
    3.某些列表项
    4.某些列表项

    我个人编写了以下函数,虽然不完美,但对我来说效果很好

    函数返回HTMLINES($html,$AMONTOFLINES=4){
    $lines_arr=array_值(array_过滤器(preg_split('/\n |\r/',$html));
    $linesToReturn=array\u slice($lines\u arr,0,$amountofline);
    返回preg_replace('/\s{2,}/m','',内爆(''$linesToReturn));
    }
    
    使用
    echo
    时返回以下HTML:

    您好,这是一些生成的HTML。

  • 一些列表项
  • 一些列表项
  • 或格式化:

    你好,这是一些生成的HTML

  • 某些列表项
  • 一些列表项
  • 浏览器将自动关闭
    标记,因此它可以满足我的需要


    对于文本文件的.html文件,谢谢您的链接,我已将其签出。我认为我的问题不同于之前提出的HTML问题,因为它将每个HTML标记计算为一行。我不希望
    inline
    元素标记表示一行。在我的例子中,“”也需要算作一行。没有一个简单的方法可以实现这一点。您需要它只是为了演示的原因?是的,我想有一个一致的行数进行预览。这将帮助用户在点击链接之前阅读部分文本。例如,在显示搜索结果时,您只希望在预览中显示3行@Jorgieguelsanchez试图找到一个PHP/服务器端解决方案对我来说似乎没有多大意义,至少没有给出到目前为止给出的参数/要求。如果你对客户一无所知,你首先就不知道文本的宽度。如果其中一个LI中的文本不仅仅是“某个列表项”,而是它的15或50倍呢?毫无疑问,在某个时候,单个LI会在客户机上分成几行…