2011-01-28 13 views
0

私は操作する必要があるいくつかの異なるソースからhtmlで読んでいます。これの一部として、html内の情報の一部を置き換えなければならないpreg_replace()呼び出しがいくつかあります。入力がhtmlの場合、preg_replaceがnullを返す(すべてではない)

私はこれを行う必要があるサイトの90%で、すべて正常に動作し、残りの10%はそれぞれのpreg_replace()呼び出しでNULLを返しています。

同じ問題があると思われる他の記事に基づいて、pcre.backtrack_limitとpcre.recursion_limitを増やしてみましたが、これは役に立たなかったです。

私は、PHPドキュメントが全く役に立たないと証明するために '4'を返すpreg_last_error()を出力しています。だから、誰かがこの問題を解消できれば、しかし、私は困惑しています。

$html = preg_replace('@<script[^>]*?.*?</script>@siu', '', $html); 

が、私が言ったように、これは時間の90%に動作します:問題の例の

一つがあります。

+0

私は '*'どのように解釈されるかわかりませんが、それは冗長なようだ(に相当するものは、 '*'、ありません?)。 – pascal

+0

また、最初の ' 'をつけないのはなぜですか? – pascal

+1

@pascalこれは、 '*'量限定子を不公平にします。 (http://php.net/manual/en/regexp.reference.repetition.php) – arnaud576875

答えて

2

正規表現でHTMLを解析しないでください。実際のDOMパーサーを使用してください:

$dom = new DOMDocument; 
$dom->loadHTML($html); 
$scripts = $dom->getElementsByTagName('script'); 
while ($el = $scripts->item(0)) { 
    $el->parentNode->removeChild($el); 
} 
$html = $dom->saveHTML(); 
+0

私はDOMDocumentの使用を検討しており、基本的なバージョンが動作しています。私が他の子供の前に要素を修正したいのであれば、appendChild()を最後に追加するだけで、それらをすべてループする必要がありますか? – Simon

+0

@Simonあなたはそれが何を意味するかはっきりしていません。私はあなたが['DOMNode :: insertBefore'](http://php.net/manual/en/domnode.insertbefore.php)を探していると思います。 – lonesomeday

+0

それが見つかりました。以前と同じように機能していましたが、追加サイトもありました。みんなあなたの助けをありがとう。 – Simon

0

あなたは悪いutf-8です。

/** 
* Returned by preg_last_error if the last error was 
* caused by malformed UTF-8 data (only when running a regex in UTF-8 mode). Available 
* since PHP 5.2.0. 
* @link http://php.net/manual/en/pcre.constants.php 
*/ 
define ('PREG_BAD_UTF8_ERROR', 4); 

ただし、実際には正規表現を使用してhtmlを解析しないでください。また、私はこの答えはYou can't parse [X]HTML with regex.

0

あなたの#4にエラーが「PREG_BAD_UTF8_ERROR」である含めずに完全なものとは思わない、あなたはサイト上で使用される文字セットをチェックする必要があります。このエラーの原因となったWICH:DOMDocument

EDIT使用してください。

0

バックトラックまたは内部再帰制限を超過した可能性があります。 ?

http://php.net/manual/en/pcre.configuration.phpがにpreg_replace前にこれを試してみてください参照してください。

ini_set('pcre.backtrack_limit', '10000000'); 
ini_set('pcre.recursion_limit', '10000000'); 
関連する問題