0

preg_match_allステートメントに問題があります。記事を入力している間は完全に機能していますが、一定の長さを超えると突然、すべての機能が停止します。これは、非常に多くの文字の後で何も実行されないという関数の既知の問題ですか?

$number = preg_match_all("/(<!-- ([\w]+):start -->)\n?(.*?)\n?(<!-- \\2:stop -->)/s", $data, $matches, PREG_SET_ORDER);

これはずっと正常に機能しており、他のページでも正常に機能しますが、その記事が一定の長さを超えると、その記事では機能しなくなります。より長いテキストブロックで機能させるために使用できる別の解決策はありますか?処理中の記事の長さは約33,000文字(スペースを含む)です。

私は以前にこのような質問をしましたが、実際にテストしたことのない答えは1つしかありませんでした。前回、その特定のシナリオでそれを回避する別の方法を見つけましたが、今回はすべて1つの記事であるため、回避する方法はありません。を変更してみpcre.backtrack_limitましpcre.recursion_limitたが、50万までもまったく効果がありませんでした。これが発生している理由と、これらの巨大なテキストブロックに対しても機能し続けるために私ができることについて他に何かアイデアはありますか?30,000文字の制限は少し低いようです。これは、わずか5,000〜6,000語です(これは約5,700語です)。2つの別々のテキストブロックにある場合、開始と停止が見つからないため、ここで分割することは実際にはオプションではありません。

4

2 に答える 2

1

私は一度これにぶつかりました、そしてそれを解決することができた唯一の方法は、ひもを分割することでした。あなたができるexplode()preg_split()

私のソースコードから文字通り引用します:

    // regexps have failed miserably on very large tables...
    $parts = explode("<table",$html);

しかし、これは2年前のことです。

于 2010-07-16T02:09:50.000 に答える
0

HTMLを扱っているようです。さまざまなパーサーのいずれかを使用することを検討してください。たとえば、DOM にはcomments 用の特定のクラスがあるため、それらで動作することがわかっています。残念ながら、DOM は扱いにくいものです。

もう 1 つのオプションは、XML をストリームとして読み取り、途中でトークンとして処理するXMLReaderを使用することです。コメントの意味を理解しているようです。私は自分でそれを使用したことがないので、それがどれほどうまく機能するかはわかりません. (DOM のloadHTMLおよびsaveXMLメソッドを使用して、HTML を XML に変換できます。ただし、HTML の形式がそれほどひどいものでないことを前提としています。)

最後に、カスタム コメント用のトークナイザーまたはパーサーを作成することを検討してください。難しすぎることはありません。また、私が指摘した XML ソリューションのいずれかを学習するよりも、一緒にハックしたほうが早いかもしれません。

于 2010-07-16T04:39:58.883 に答える