【问题标题】:php preg_match_all backslash problemphp preg_match_all 反斜杠问题
【发布时间】:2011-06-11 15:01:08
【问题描述】:

我的文本中有 img 标签,我想从 src 中获取文件名

所以我使用这个代码

preg_match_all("|\/img\/(.*)\/>|U", $article_header, $matches, PREG_PATTERN_ORDER);
echo "match=".$matches[1][0]."<br/>";

这样做我得到了这个结果

ma​​tch=500.JPG\" alt=\"\" width=\"500\" height=\"360\"

所以在这种情况下,我使用“\/>”,表示标签的结尾。

但我只想要文件名“500.JPG”所以我必须使用“\”但是当我这样做时

    preg_match_all("|\/img\/(.*)\\|U", $article_header, $matches, PREG_PATTERN_ORDER);

我没有匹配到:( 请帮忙

在 yes123 的帮助下我做到了

$doc = new DOMDocument();
$doc->loadHTML($article_header);

$imgs = $doc->getElementsByTagName('img');
$img_src = array();
foreach ($imgs as $img) {
// Store the img src
$img_src[] = $img->getAttribute('src');
echo $img_src[0];
}

这给了我这个

\"sources/public/users/qqqqqq/articles/2011-06-11/7/img/500.JPG\"

但现在无论如何我只想要 500.JPG

那么什么是正确的正则表达式?

【问题讨论】:

  • 你为什么使用正则表达式?

标签: php


【解决方案1】:

要在正则表达式中匹配一个真正的反斜杠字符,你必须“双转义”它,这意味着 4 个反斜杠来匹配一个反斜杠:\\\\

preg_match_all("|/img/(.*)\\\\|U", ...);

【讨论】:

  • 感谢弗洛姆!这就是我想要的:)
【解决方案2】:
preg_match_all('/<img[^>*]src="([^"]+)".*>/Uis', $article_header, $matches)

【讨论】:

    【解决方案3】:

    您无法使用正则表达式解析 HTML。

    使用DOMDocument

    // HTML already parsed into $dom
    $imgs = $dom->getElementsByTagName('img');
    $img_src = array();
    foreach ($imgs as $img) {
      // Store the img src
      $img_src[] = $img->getAttribute('src');
    
    }
    

    别忘了,在提出问题之前,您始终可以搜索 google 或 stackoverflow

    【讨论】:

    • 你可以为我的问题写例子吗?
    • 他并没有要求解析完整的 HTML 文档树或任何类型的嵌套结构。如果您只需要从图像标签中提取 src 属性,正则表达式就可以正常工作。
    • @Evert 我猜你没有读过这个:stackoverflow.com/questions/1732348/… 这适用于它只是一个 DOMElement 或 HTML 页面。带有单引号甚至没有任何引号的 src 呢?等号前后还有空格吗?为此写一个正则表达式,我会写一个你的正则表达式不会捕获的 img
    • 也许我太菜鸟但是这段代码崩溃了 $imgs = $article_header->getElementsByTagName('img'); $img_src = 数组(); foreach ($imgs as $img) { // 存储 img src $img_src[] = $img->getAttribute('src'); }
    • @david 你需要实例化 domdocument。it.php.net/manual/en/domdocument.loadhtml.php
    【解决方案4】:

    试试类似的,我现在测试了:

    $article_header = 'foo <img src=\\"sources/public/users/qqqqqq/articles/2011-06-11/7/img/500.JPG\\" /> foo';
    preg_match_all('|<img[^>]+?src="[^"]*?([^/"]+?)"|', stripslashes($article_header), $matches, PREG_PATTERN_ORDER);
    echo "match=".$matches[1][0]."<br/>";
    

    您的$article_header 似乎带有斜线(这有点烦人),所以我添加了一个stripslashes()

    【讨论】:

    • 抱歉,您没有得到带有斜杠的数据并且您只需要文件名(而不是路径)。如您所见,我改进了答案。
    【解决方案5】:

    使用php函数路径信息

    http://php.net/manual/en/function.pathinfo.php

    pathinfo($img_src[0]);
    

    结果

    Array
    (
        [dirname] => sources/public/users/qqqqqq/articles/2011-06-11/7/img/
        [basename] => 500.JPG
        [extension] => JPG
        [filename] => 500
    )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-25
      • 2016-09-20
      • 2011-07-13
      • 2020-12-25
      相关资源
      最近更新 更多