使用大量空格时,preg_replace返回空字符串

时间:2013-02-15 05:44:12

标签: php regex preg-replace

我知道it is not recommended to parse XML / HTML with a reg-ex,但我正在尝试做这件事:

<?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版本上测试过。

感谢。

2 个答案:

答案 0 :(得分:1)

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

$match = '!<([^ ]+) ([^=]+)="(.*?)">!';

答案 1 :(得分:0)

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

<(\S*?) (\S*?)="([^"]*?)">