1

次の2つの正規表現があり、それらが機能しない理由が何であるか疑問に思っています:

$regex='#<br><h1 class="band name">(.+?)</h1><span class="bandinfotop">#';
preg_match($regex,$content,$match);
$name=$match[1];

それが機能する場合、選択された文字列は、たとえば **Häuptling と "(R) Brechende Zäune"​​ のようなものです。それが機能する例は「!n:fact」です。

今、正規表現を台無しにする文字列内の特定の兆候が原因であるかどうか疑問に思っていますか? ウムラウトのような?

コードの後半で私はこれをやっています:

$name=strip_tags($name);
$name=htmlentities($name,null,"UTF-8");
if($name=="") $name="NULL";

一致するものが見つからなかったものについては、「NULL」がエコーされます。

助けてくれてありがとう!チャールズ

EDIT 1 最後の 3 行のようです - 最後の行の前の 2 行をコメントアウトすると、正常に動作します。

解決策 htmlentities() でパラメータ null と「UTF-8」を削除すると、何とか機能しました。誰かが理由を知っていますか?

4

2 に答える 2

2

スクラップ元のサイトが小ぎれいになり、正規表現を削除<br>または追加する</h1><span正規表現が壊れるとどうなりますか。HTMLの解析に正規表現を使用しないでください!

代わりに、 simplehtmldomのような dom パーサーを使用するか、単純に phps ネイティブDOMDocumentを使用します。

<?php 
$source = '<br><h1 class="band name">Häuptling and "(R) Brechende Zäune</h1><span class="bandinfotop">';


header('Content-Type: text/html; charset=utf-8');
$return = array();
$dom = new DOMDocument("1.0","UTF-8");
@$dom->loadHTML($source);
$dom->preserveWhiteSpace = false;

foreach($dom->getElementsByTagName('h1') as $headings) {
    if($headings->getAttribute('class') == "band name"){
        $title = $headings->nodeValue;
    }
}

echo $title; //Häuptling and "(R) Brechende Zäune
?>
于 2012-06-14T21:27:45.730 に答える
1

解析は正規表現よりも信頼性があります。

   $yourhtml = '<br><h1 class="band name">argh!</h1><span class="bandinfotop">';
   $dom = new DOMDocument();
   $dom->recover = true;
   $dom->loadHTML($yourhtml);
   $x = new DOMXPath($dom);
   foreach($x->query('//h1[@class="band name"]') as $node) var_dump($node->nodeValue);

しかし、正規表現も機能します。

   $content = '<br><h1 class="band name">**Häuptling and "(R) Brechende Zäune"</h1><span class="bandinfotop">';
   $regex='#<br><h1 class="band name">(.+?)</h1><span class="bandinfotop">#';
   preg_match($regex,$content,$match);
   var_dump(htmlentities(strip_tags($match[1]),null,'utf-8'));
   $content = '<br><h1 class="band name">!n:fact"</h1><span class="bandinfotop">';
   preg_match($regex,$content,$match);
   var_dump(htmlentities(strip_tags($match[1]),null,'utf-8'));

   //string(47) "**H&auml;uptling and "(R) Brechende Z&auml;une""
   //string(8) "!n:fact""

...だからあなたの特定の問題はどこか他の場所です。

于 2012-06-14T21:26:40.817 に答える