4

以下のコードは、私の PC の XAMPP では完全に機能しますが、新しく購入した VPS では機能しません。それは私のコードをクラッシュさせました。

preg_match_all( "/$regex/siU" , $string , $matches , PREG_SET_ORDER );

これは、HTML からリンクとタイトルを単純に取得することが期待されます。

以前、同様の正規表現の問題が今日発生しました。コードはローカル サーバーで正常に実行されていましたが、vps で「接続がリセットされました」というエラーが発生しました。この問題は、出力を最適化するために以下のコードを使用して削除されたコメント付きの html (内部に php コードを含む) が原因で発生しましたが、接続のリセットの問題も解決され、HTML にはまだブラウザー ソースにコメントが含まれています。

$string = preg_replace( '/<!--(.|\s)*?-->/' , ''    , $string );

したがって、問題は明らかです。これらの正規表現関数は正常に機能していません。しかし、私は解決策を知りません。

誰でもこれを解決するのを手伝ってくれますか?

解決済み:

https://stackoverflow.com/a/12761686/369005 @vimishorに感謝

4

5 に答える 5

2

PCRE では、200 行を超えるテキストで問題が発生することがあります。Drupal と GeSHi の開発者は、過去にこの問題に見舞われました。

参考文献:

  1. Drupal PCRE 号 @ 2012 年 3 月 23 日
  2. GeSHi PCRE 号 @ 2012 年 2 月 2 日

テキストを小さなチャンク (たとえば 100 行) に分割し、各チャンクで正規表現を実行できる場合は、役立つ場合があります。

于 2012-10-06T16:42:28.900 に答える
1

根本的な問題は、HTML コメントを削除するはずのコードが機能していないことでしょうか? これはおそらく、コメントに一致するはずの正規表現が、改行に一致しない(.|\s)*という事実を回避するために使用されているためです。この回答が説明し.ているように、それは問題を引き起こすことがほぼ保証されています。

改行を含むものに一致させる正しい方法は、s修飾子を使用することです。例えば:

'/<!--.*?-->/s'

これにより、単一行モード (DOTALL モードとも呼ばれます) がオンになり、.改行に一致するようになります。[\S\s]( JavaScriptには単一行/ DOTALLモードに相当するものがないため、他の質問の作成者は代わりに使用する必要がありました。)

于 2012-10-07T06:41:15.573 に答える
1

ちょっと止めさせてください。正規表現を使用して HTML を解析することは、不正なドキュメントの非常に孤立した問題でない限り、悪い考えです。適切なパーサーを使用する必要があります。たとえば、HTML コメントを削除する例を次に示します。

$html = <<<EOM
<html>
<body>
<div id="test">
<!--
comment here
-->
</div>
</body>
</html>
EOM;

$d = new DOMDocument;
$d->loadHTML($html);

$x = new DOMXPath($d);

foreach ($x->query('//comment()') as $node) {
        $node->parentNode->removeChild($node);
}

echo $d->saveHTML();
于 2012-10-06T16:46:57.717 に答える
0

問題は、html コメントの機能を誤解しているようです。質問の下のコメントによると、問題は html コメントが削除されなかったため、php が間違ったパラメーターで実行されたことです。

ただし、html コメントは、実行されている、または実行されていない php コードには影響せず、ブラウザが表示するもの (および javascript の場合は実行するもの) にのみ影響します。出力がブラウザに到達する前に、php コードが実行されます。

PHPコードをコメントアウトしたい場合は、/* */ブロックに入れるか、各行を.で始める必要があります//

于 2012-10-06T16:50:53.870 に答える
-1

これを試して:

$string = preg_replace( '/.*<!--(.|\s)*?-->.*/' , ''    , $string );

一部の正規表現の実装では、次のような正規表現が実行されます/^<!--(.|\s)*?-->$/。したがって、式はサーバーごとに異なる動作をする可能性があります。

于 2012-10-06T16:13:28.097 に答える