将 HTML 字符串转换为 PHP 数组
Converting HTML string to PHP array
假设 HTML 字符串如下:
$str = '<p>Hello World!</p><p style="text-align:center"><img src="foo.png" /><br /></p>';
这样可以转成数组吗?
[0] => '<p>Hello World!</p>'
[1] => '<p style="text-align:center">'
[2] => '<img src="foo.png" />'
[3] => '<br />'
[4] => '</p>'
我尝试以多种不同方式使用 DOMDocument,但问题似乎总是归结为育儿问题。我需要遍历 HTML 而不考虑 parent/child 关系。
你想为此使用 PHP DOM 扩展吗?
或者,您可以按如下方式简单地在换行符上展开:
var_dump(explode("\n", $html));
这导致:
Array
(
[0] => <p>Hello World!</p>
[1] => <p style="text-align:center">
[2] => <img src="foo.png" />
[3] => <br />
[4] => </p>
)
您可以使用正则表达式来实现这一点。
$input = '<p>Hello World!</p><p style="text-align:center"><img src="foo.png" /><br /></p>';
$regex = '/(<[a-z0-9=\-:." ^\/]+\/>)|(<[^\/]+>[^<\/]+<\/[a-z0-9]+>)|(<[a-z0-9=\-:." ^\/]+>)/';
$result = [];
preg_match_all($regex, $input, $result);
$result = $result[0];
$result
看起来像
array(5) {
[0] =>
string(19) "<p>Hello World!</p>"
[1] =>
string(29) "<p style="text-align:center">"
[2] =>
string(21) "<img src="foo.png" />"
[3] =>
string(6) "<br />"
[4] =>
string(4) "</p>"
}
但有两点很重要:
- 确定这个正则表达式模式可以改进,它更像是一个例子。
- 在不同的情况下测试它 因为我对你的特定示例输入进行了测试,它可能会在更复杂的结构上失败。在这种情况下,根据您的需要进行调整。
@olibiaz 的回答就可以了..
只是想展示另一种使用 preg_split 的方法。
$str = '<p>Hello World!</p><p style="text-align:center"><img src="foo.png" /><br /></p>';
$flags = PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY;
$regex = '/(<[a-z0-9=\-:." ^\/]+\/>)|(<[^\/]+>[^<\/]+<\/[a-z0-9]+>)|(<[a-z0-9=\-:." ^\/]+>)/';
$parts = preg_split( $regex, $str, -1, $flags);
输出:
array (size=5)
0 => string '<p>Hello World!</p>' (length=19)
1 => string '<p style="text-align:center">' (length=29)
2 => string '<img src="foo.png" />' (length=21)
3 => string '<br />' (length=6)
4 => string '</p>' (length=4)
没有正则表达式解决方案:
$str = '<p>Hello World!</p><p style="text-align:center"><img src="foo.png" /><br /></p>';
$tags = explode( '|', str_replace('><', '>|<', $str));
print_r($tags);
输出:
Array
(
[0] => <p>Hello World!</p>
[1] => <p style="text-align:center">
[2] => <img src="foo.png" />
[3] => <br />
[4] => </p>
)
假设 HTML 字符串如下:
$str = '<p>Hello World!</p><p style="text-align:center"><img src="foo.png" /><br /></p>';
这样可以转成数组吗?
[0] => '<p>Hello World!</p>'
[1] => '<p style="text-align:center">'
[2] => '<img src="foo.png" />'
[3] => '<br />'
[4] => '</p>'
我尝试以多种不同方式使用 DOMDocument,但问题似乎总是归结为育儿问题。我需要遍历 HTML 而不考虑 parent/child 关系。
你想为此使用 PHP DOM 扩展吗? 或者,您可以按如下方式简单地在换行符上展开:
var_dump(explode("\n", $html));
这导致:
Array
(
[0] => <p>Hello World!</p>
[1] => <p style="text-align:center">
[2] => <img src="foo.png" />
[3] => <br />
[4] => </p>
)
您可以使用正则表达式来实现这一点。
$input = '<p>Hello World!</p><p style="text-align:center"><img src="foo.png" /><br /></p>';
$regex = '/(<[a-z0-9=\-:." ^\/]+\/>)|(<[^\/]+>[^<\/]+<\/[a-z0-9]+>)|(<[a-z0-9=\-:." ^\/]+>)/';
$result = [];
preg_match_all($regex, $input, $result);
$result = $result[0];
$result
看起来像
array(5) {
[0] =>
string(19) "<p>Hello World!</p>"
[1] =>
string(29) "<p style="text-align:center">"
[2] =>
string(21) "<img src="foo.png" />"
[3] =>
string(6) "<br />"
[4] =>
string(4) "</p>"
}
但有两点很重要:
- 确定这个正则表达式模式可以改进,它更像是一个例子。
- 在不同的情况下测试它 因为我对你的特定示例输入进行了测试,它可能会在更复杂的结构上失败。在这种情况下,根据您的需要进行调整。
@olibiaz 的回答就可以了..
只是想展示另一种使用 preg_split 的方法。
$str = '<p>Hello World!</p><p style="text-align:center"><img src="foo.png" /><br /></p>';
$flags = PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY;
$regex = '/(<[a-z0-9=\-:." ^\/]+\/>)|(<[^\/]+>[^<\/]+<\/[a-z0-9]+>)|(<[a-z0-9=\-:." ^\/]+>)/';
$parts = preg_split( $regex, $str, -1, $flags);
输出:
array (size=5)
0 => string '<p>Hello World!</p>' (length=19)
1 => string '<p style="text-align:center">' (length=29)
2 => string '<img src="foo.png" />' (length=21)
3 => string '<br />' (length=6)
4 => string '</p>' (length=4)
没有正则表达式解决方案:
$str = '<p>Hello World!</p><p style="text-align:center"><img src="foo.png" /><br /></p>';
$tags = explode( '|', str_replace('><', '>|<', $str));
print_r($tags);
输出:
Array
(
[0] => <p>Hello World!</p>
[1] => <p style="text-align:center">
[2] => <img src="foo.png" />
[3] => <br />
[4] => </p>
)