拆分html代码标签和内容

时间:2009-11-07 15:24:06

标签: php regex arrays split preg-split

有关正则表达式的知识比我更多的人知道如何拆分html代码,以便所有标签和所有单词分开,即

<p>Some content <a href="www.test.com">A link</a></p>

像这样分开:

array = { [0]=>"<p>",
          [1]=>"Some",
          [2]=>"content",
          [3]=>"<a href='www.test.com'>,
          [4]=>"A",
          [5]=>"Link",
          [6]=>"</a>",
          [7]=>"</p>"

到目前为止,我一直在使用preg_split,并且已成功设法通过空格拆分字符串或按标签拆分 - 但是当我将其拆分为时,所有内容都在一个数组元素中。

有人帮帮我吗?

5 个答案:

答案 0 :(得分:4)

在这种情况下不应使用

preg_split。试试preg_match_all:

$text = '<p>Some content <a href="www.test.com">A link</a></p>';
preg_match_all('/<[^>]++>|[^<>\s]++/', $text, $tokens);
print_r($tokens);

输出:

Array
(
    [0] => Array
        (
            [0] => <p>
            [1] => Some
            [2] => content
            [3] => <a href="www.test.com">
            [4] => A
            [5] => link
            [6] => </a>
            [7] => </p>
        )

)

我假设您忘记在示例中的'A'中加入'A link'

了解HTML包含&lt;或者&gt;并不意味着标签的开头或结尾,正则表达式会让事情变得糟糕! (因此警告)

答案 1 :(得分:2)

您可以查看Simple HTML DOM Parser

或者查看PHP中的DOM parser

答案 2 :(得分:1)

尝试Simple HTML Dom Parser。 HTML对于正则表达式来说太不规则了。

答案 3 :(得分:1)

对于巴特(preg_match_all()优于preg_split()的建议,我不同意巴特。

字面上的任务是将整个字符串“拆分”为各种定界符。首先,我建议在regex上使用dom解析器的稳定性,但是如果由于输入html相对可预测/过于简单而又不需要这种稳定性,那么regex可以用作更便宜,更简洁的选择。 / p>

代码:(Demo

$html = <<<HTML
<p>Some content <a href="www.test.com">A link</a></p>
HTML;

var_export(preg_split('~\s+|(<[^>]+>)~', $html, -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE));

输出:

array (
  0 => '<p>',
  1 => 'Some',
  2 => 'content',
  3 => '<a href="www.test.com">',
  4 => 'A',
  5 => 'link',
  6 => '</a>',
  7 => '</p>',
)

我的模式在一个或多个空格字符或html标记(对a的解释很弱)上分割。空白仅被丢弃。标签会保留在输出中。

除了逻辑语义外,preg_split()还具有产生较小的膨胀并因此产生更直接输出的附加好处。 preg_split()提供一维数组,preg_match_all()提供多维数组。

最后,preg_split()不能像preg_match_all()那样“失败”。想象一下这种不太可能发生的边缘情况,其中输入字符串不包含任何空格或标签。 preg_split()将把整个输入字符串作为单个元素数组返回(有用且与更常见的输入字符串一致)。 preg_match_all()将生成一个空数组(不是很有用)。

答案 4 :(得分:0)

我目前在多个应用程序中使用Simple HTML DOM Parser并发现它是一个很好的工具,即使与其他语言编写的其他HTML解析器进行比较也是如此。

为什么要将HTML拆分为您描述的令牌字符串? DOM元素的树状结构不是更适合您特定应用的方法吗?