0

我知道不建议使用 reg-ex 解析 XML / HTML,但我正在尝试做这个简单的事情:

<?php
echo phpversion()."<br><br>";

$test_1 = '<Tag attr="attr_value">Tag_value</Tag>';
$test_2 = $test_1.str_repeat(' ',1000);
$test_3 = $test_1.str_repeat(' ',2000);

$match = '!<(.*?) (.*?)="(.*?)">!';
$replace = '<\\2>\\3</\\2><\\1>';

$output_1 = preg_replace($match, $replace, $test_1);
$output_2 = preg_replace($match, $replace, $test_2);
$output_3 = preg_replace($match, $replace, $test_3);

echo "xml: ".htmlspecialchars($test_1)."<br>";
echo "1: ".htmlspecialchars($output_1)."<br>";
echo "2: ".htmlspecialchars($output_2)."<br>";
echo "3: ".htmlspecialchars($output_3)."<br>";
?>

我的意思是,将一个属性及其值放在容器标签之外。在 test_1 和 test_2 示例中一切正常,但如果我在 test_3 中添加更多空格,则返回字符串为空。有人可以试试这个代码吗?

在此示例中,它可以添加 1411 个空格。再来一张 (1412) 并没有...

我已经在 5.3.8 和 5.3.19 PHP 版本上进行了测试。

谢谢。

4

2 回答 2

1

使用此正则表达式,它将正常工作:

$match = '!<([^ ]+) ([^=]+)="(.*?)">!';
于 2013-02-15T05:57:44.760 回答
0

从命令行在 PHP 4.4.8 上对我来说工作正常。你的表达似乎非常低效。可能它会导致某种错误,例如内存不足,因此 preg_replace 返回NULL这意味着“错误”。这是您的表达式的优化版本:

<(\S*?) (\S*?)="([^"]*?)">
于 2013-02-15T05:58:10.110 回答