0

XML / HTML を 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 個のスペースを追加して動作します。もう1つ(1412)、そうではありません...

5.3.8 および 5.3.19 の PHP バージョンでテストしました。

ありがとう。

4

2 に答える 2

1

この正規表現を使用すると、正しく機能します。

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

コマンドラインからPHP 4.4.8でうまく動作します。あなたの表現は非常に効率が悪いようです。おそらく、メモリ不足などの何らかのエラーが発生するため、NULL「エラー」を意味する preg_replace が返されます。式の最適化されたバージョンは次のとおりです。

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