有关正则表达式的知识比我更多的人知道如何拆分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,并且已成功设法通过空格拆分字符串或按标签拆分 - 但是当我将其拆分为时,所有内容都在一个数组元素中。
有人帮帮我吗?
答案 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)
或者查看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元素的树状结构不是更适合您特定应用的方法吗?