RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 844293
Accepted
Владимир
Владимир
Asked:2020-06-20 17:07:06 +0000 UTC2020-06-20 17:07:06 +0000 UTC 2020-06-20 17:07:06 +0000 UTC

受约束的正则表达式

  • 772

我在 PHP 中工作。您需要替换所有扩展名为 jpg、png 等的链接。我这样做:

$row["message"] = preg_replace('/<a\shref=\"(.+?[jpeg|jpg|png])\"\starget=\"_blank\">(.+?)<\/a>/is', '<a data-fancybox="gallery" href="$1"><img src="$1" alt="" class="tmp_class"></a>', $row["message"]);

用于测试以下行:

<p>С этой формы приходят заявки <a href="https://site.com/lack_tech.php">https://site.com/lack_tech.php</a></p>
<p>Или что ты имеешь ввиду?</p>
<div class="attachment_files_message"> 
   <p>Прикреплённые файлы:</p>
   <a href="http://site.com/public/uploads/kylticket/2670/Screenshot_1.png" target="_blank">Screenshot_1.png</a>
</div>

也就是说,您需要替换第二个链接,根据我的代码,链接开头<a href="....和最后一个结束标记之间的所有内容都被替换</a>

php
  • 1 1 个回答
  • 10 Views

1 个回答

  • Voted
  1. Best Answer
    Wiktor Stribiżew
    2020-06-20T19:18:02Z2020-06-20T19:18:02Z

    该模式[jpeg|jpg|png]是相同的[jegnp|],因为它[...]是一个字符类,它匹配该类中指定的字符中的 1 个字符。它.+?也可能捕获过多的文本,因为点匹配任何字符。

    如果替换\"(.+?[jpeg|jpg|png])\"为"([^"]*\.(?:jpe?g|png))",错误将消失,但在某些情况下,此表达式仍然不起作用(不同数量的空白字符、属性的缺失或位置在不同的位置target=\"_blank\")。

    DOMDocument在这种情况下,基于解决方案似乎更合适。

    见 PHP 演示:

    $html = <<<EOD
    <p>С этой формы приходят заявки <a href="https://site.com/lack_tech.php">https://site.com/lack_tech.php</a></p>
    <p>Или что ты имеешь ввиду?</p>
    <div class="attachment_files_message"> 
       <p>Прикреплённые файлы:</p>
       <a href="http://site.com/public/uploads/kylticket/2670/Screenshot_1.png" target="_blank">Screenshot_1.png</a>
    </div>
    EOD;
    
    $dom = new DOMDocument();    // Создаем DOM
    $dom->loadHTML(mb_convert_encoding($html, 'HTML-ENTITIES', 'UTF-8'), LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD); // Парсим DOM
    $xpath = new DOMXPath($dom);         // Инициализируем структуру XPath на основе DOM    
    foreach ($xpath->query('//a[@target="_blank"]') as $OurNode) {
        if (preg_match('~\.(?:jpe?g|png)$~i', $OurNode->getAttribute('href'))) {
            $fragment = $dom->createDocumentFragment();
            $aNode = $dom->createElement('a');
            $aNode->setAttribute('data-fancybox', 'gallery'); 
            $aNode->nodeValue = ''; 
            $aNode->setAttribute('href', $OurNode->getAttribute('href'));
    
            $img = $dom->createElement('img');
            $img->setAttribute("src", $OurNode->getAttribute('href'));
            $img->setAttribute("alt", "");
            $img->setAttribute("class", "tmp_class");
            $aNode->appendChild($img);
            $fragment->appendChild($aNode);
            $OurNode->parentNode->replaceChild($fragment, $OurNode);
        }
    }
    echo mb_convert_encoding($dom->saveHTML(), 'UTF-8', 'HTML-ENTITIES');
    

    结果

    <p>С этой формы приходят заявки <a href="https://site.com/lack_tech.php">https://site.com/lack_tech.php</a><p>Или что ты имеешь ввиду?</p><div class="attachment_files_message"> 
       <p>Прикреплённые файлы:</p>
       <a data-fancybox="gallery" href="http://site.com/public/uploads/kylticket/2670/Screenshot_1.png"><img src="http://site.com/public/uploads/kylticket/2670/Screenshot_1.png" alt="" class="tmp_class"></a>
    </div></p>
    

    在foreach ($xpath->query('//a[@target="_blank"]') as $OurNode)我们正在寻找a属性target等于的所有标签_blank。接下来,我们检查属性值是否以hrefsubstrings或结尾.jpeg,然后我们创建一个新标签,为其添加属性,一个带有属性的子元素,最后用新标签替换旧标签。.jpg.pngaimga

    如果在这里使用正则表达式,值得一试

    preg_replace('~<a\s+((?:[^\s<>\'"=]+(?:=(?:"[^"]*"|\'[^\']*\'|[^\s\'">]+))?\s+)*)href=(?|"([^"]*\.(?:jpe?g|png))"|\'([^\']*\.(?:jpe?g|png))\'|([^\s\'">]*\.(?:jpe?g|png))(?=[>\s]))((?:\s+[^\s<>\'"=]+(?:=(?:"[^"]*"|\'[^\']*\'|[^\s\'">]+))?)*)\s*>(.*?)</a>~is', 
        '<a $1$3 data-fancybox="gallery" href="$2"><img src="$2" alt="" class="tmp_class"></a>',
        $row["message"])
    

    正则表达式演示

    细节

    • <a- 子串<a
    • \s+- 1+ 空白字符
    • ((?:[^\s<>'"=]+(?:=(?:"[^"]*"|'[^']*'|[^\s'">]+))?\s+)*)- 捕获子模式#1:具有可选值的属性的 0 次或多次重复(即它可以是类似的东西required,target='_blank'等等)
    • href=(?|"([^"]*\.(?:jpe?g|png))"|'([^']*\.(?:jpe?g|png))'|([^\s'">]*\.(?:jpe?g|png))(?=[>\s]))-=后跟可选引号'/"和捕获子模式 #2,它捕获'...'/"..."或非空白字符内的文本',如果值以+结尾,或者">href.jpegjpgpng
    • ((?:\s+[^\s<>'"=]+(?:=(?:"[^"]*"|'[^']*'|[^\s'">]+))?)*)- 捕获子模式#3:具有可选值的 0 次或更多属性重复(即可能是required, target='_blank' 等)
    • \s*>- 0+ 空白字符和>
    • (.*?)- 捕获子模式 #4:第一次出现之前的 0 个或多个任意字符
    • </a>- 子串</a>。

    您需要将匹配替换为<a $1$3 data-fancybox="gallery" href="$2"><img src="$2" alt="" class="tmp_class"></a>,因为在捕获组 #1 和 #3 中可能还有其他属性。

    另请参阅 PHP 演示:

    $message = '<p>С этой формы приходят заявки <a href="https://site.com/lack_tech.php">https://site.com/lack_tech.php</a></p>
    <p>Или что ты имеешь ввиду?</p>
    <div class="attachment_files_message"> 
       <p>Прикреплённые файлы:</p>
       <a href="http://site.com/public/uploads/kylticket/2670/Screenshot_1.png" target="_blank">Screenshot_1.png</a>
    </div>';
    $message = preg_replace('~<a\s+((?:[^\s<>\'"=]+(?:=(?:"[^"]*"|\'[^\']*\'|[^\s\'">]+))?\s+)*)href=(?|"([^"]*\.(?:jpe?g|png))"|\'([^\']*\.(?:jpe?g|png))\'|([^\s\'">]*\.(?:jpe?g|png))(?=[>\s]))((?:\s+[^\s<>\'"=]+(?:=(?:"[^"]*"|\'[^\']*\'|[^\s\'">]+))?)*)\s*>(.*?)</a>~is', 
            '<a $1$3 data-fancybox="gallery" href="$2"><img src="$2" alt="" class="tmp_class"></a>',
            $message);
    echo $message;
    

    结果

    <p>С этой формы приходят заявки <a href="https://site.com/lack_tech.php">https://site.com/lack_tech.php</a></p>
    <p>Или что ты имеешь ввиду?</p>
    <div class="attachment_files_message"> 
       <p>Прикреплённые файлы:</p>
       <a  target="_blank" data-fancybox="gallery" href="http://site.com/public/uploads/kylticket/2670/Screenshot_1.png"><img src="http://site.com/public/uploads/kylticket/2670/Screenshot_1.png" alt="" class="tmp_class"></a>
    </div>
    
    • 1

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    是否可以在 C++ 中继承类 <---> 结构?

    • 2 个回答
  • Marko Smith

    这种神经网络架构适合文本分类吗?

    • 1 个回答
  • Marko Smith

    为什么分配的工作方式不同?

    • 3 个回答
  • Marko Smith

    控制台中的光标坐标

    • 1 个回答
  • Marko Smith

    如何在 C++ 中删除类的实例?

    • 4 个回答
  • Marko Smith

    点是否属于线段的问题

    • 2 个回答
  • Marko Smith

    json结构错误

    • 1 个回答
  • Marko Smith

    ServiceWorker 中的“获取”事件

    • 1 个回答
  • Marko Smith

    c ++控制台应用程序exe文件[重复]

    • 1 个回答
  • Marko Smith

    按多列从sql表中选择

    • 1 个回答
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Suvitruf - Andrei Apanasik 什么是空? 2020-08-21 01:48:09 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5