2

有没有比我更了解正则表达式的人知道如何拆分 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 并且成功地设法按空格拆分字符串或按标签拆分 - 但是当我需要将其拆分为时,所有内容都在一个数组元素中。

有人帮我吗?

4

5 回答 5

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'in 'A link'

意识到当你的 HTML 包含 < 或 > 不是标签的开始或结束时,正则表达式会把事情搞砸!(因此警告)

于 2009-11-07T16:43:40.477 回答
2

您可以查看Simple HTML DOM Parser

或者查看PHP中的DOM解析器

于 2009-11-07T15:32:03.613 回答
1

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

于 2009-11-07T15:32:03.287 回答
0

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

为什么您将 HTML 拆分为您描述的标记字符串?对于您的特定应用程序,DOM 元素的树状结构不是更好的方法吗?

于 2009-11-07T15:58:52.407 回答
0

我不同意 Bart 关于preg_match_all()over的建议preg_split()

任务实际上是在各种分隔符上“拆分”整个字符串。首先,我推荐使用 dom 解析器而不是正则表达式的稳定性,但如果您不需要那种级别的稳定性,因为您的输入 html 相对可预测/简单,那么正则表达式可以用作更便宜、更简洁的替代方案。

代码:(演示

$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>',
)

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

除了逻辑语义之外,preg_split()还有一个额外的好处,那就是产生更少的臃肿,因此更直接的输出。 preg_split()提供一维数组并preg_match_all()提供多维数组。

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

于 2019-06-06T12:20:31.823 回答