1

我有以下两个正则表达式,我想知道它们不起作用的原因是什么:

$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:事实”。

现在我想知道是否可能是因为字符串中的任何特定符号弄乱了我的正则表达式?喜欢变音符号?

稍后在代码中我这样做:

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

对于那些它没有找到匹配的人,它会回显“NULL”。

感谢您的帮助!查尔斯

编辑 1 它似乎是最后三行 - 当最后一行之前的两行被注释掉时,它工作正常。

解决方案当我在 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 回答