【问题标题】:preg_match and file_get_contents and æ ø åpreg_match 和 file_get_contents 和 æ ø å
【发布时间】:2016-01-14 22:25:19
【问题描述】:

我有一个关于 preg_match 的问题,如果我尝试获取这样的内容:Århus er en by i Danmark 表示 Århus 是丹麦的一个城市

preg_match( "#<div id=[\"']faktaDiv[\"']>(.*?)</div>#si", $webside, $a2 );

echo $a2;

那么输出将是:

�rhus er en by i Danmark 的意思是“rhus 是丹麦的一座城市

我该如何解决这个问题?基本上它需要允许æ ø å。

【问题讨论】:

  • @chris85 - 我该怎么做?是的,文件是 UTF-8
  • #
    (.*?)
    #siu

标签: php regex preg-match file-get-contents


【解决方案1】:

对于正则表达式方法,您需要 u 修饰符。有关 PHP 修饰符的完整列表,请参阅 http://php.net/manual/en/reference.pcre.pattern.modifiers.php,您当前使用的 is 是另外 2 个修饰符。

preg_match( "#<div id=[\"']faktaDiv[\"']>(.*?)</div>#siu", $webside, $a2 );

看起来您正在解析 HTML,所以我将使用 domdocument 来解析该字符串。

$doc = new DOMDocument();
$doc->loadHTML('<div id="faktaDiv">Test Stuff</div>');
$divs = $doc->getElementsByTagName('div');
foreach($divs as $div) {
    if($div->getAttribute('id') == 'faktaDiv') {
         echo $div->nodeValue;
    }
}

要提取title,您应该使用这样的解析器。

$doc = new DOMDocument();
$doc->loadHTML('<title>Test Stuff</title>');
$title = $doc->getElementsByTagName('title')->item(0)->nodeValue;
echo $title;

据我所知,每页应该只有一个title。如果不是这种情况,请取下 -&gt;item(0)-&gt;nodeValue 并循环遍历数组。

PHP 演示:https://eval.in/502432

【讨论】:

  • u 修饰符已弃用且不起作用。我正在获取一个带有 file_get_contents 的网站,我如何在您的代码中实现它?
  • 如果我想从网站获取 之间的文本,我该如何使用 file_get_content 呢?
  • OP 的问题与缺少u 修饰符无关。模式字符串是普通的 7 位 ASCII 码,并且可以很好地找到匹配项。他的问题是他试图以不同于主题字符串的编码查看输出(我们不知道它是否是 UTF,但u 不会神奇地做到这一点,如果不是)。
  • @Morten u 修饰符在哪里标记为已弃用?如果你想标题做$divs = $doc-&gt;getElementsByTagName('title');.
  • @lafor 是的,魔法很少能解决问题。 u 修饰符告诉 preg_match 将字符串和模式视为 utf8。 OP 在 +1 小时前声明该文件是 UTF8,这是我的第一条评论。
【解决方案2】:

您可以使用 \X 匹配任何 UTF-8 字符(如点用于 ansi 字符)、特定代码点、代码点范围或 unicode 类别:

http://www.regular-expressions.info/unicode.html

为了回答你的问题,我想说用(\X*?) 替换(.*?) 就足够了。

在 Perl、PCRE、PHP 和 Ruby 2.0 中,匹配单个字素(无论是编码为单个代码点还是使用组合标记编码为多个代码点)都很容易:只需使用 \X。您可以考虑 \X 点的 Unicode 版本。但是有一个区别:\X 始终匹配换行符,而点不匹配换行符,除非您启用点匹配换行符匹配模式。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-11-13
    • 2011-10-29
    • 1970-01-01
    • 2012-05-31
    • 2020-05-23
    • 1970-01-01
    • 2018-01-28
    • 2023-03-11
    相关资源
    最近更新 更多