【问题标题】:Help with Regex expression?帮助正则表达式?
【发布时间】:2011-04-07 03:08:44
【问题描述】:

我正在尝试使用 preg_replace 过滤成员 cmets。过滤 script 和 img 标签。如果 src 来自我的站点,请使用标签允许它,如果来自另一个站点,则只显示 src

正则表达式:

  <(\w+).+src=[\x22|'](?![^\x22']+mysite\.com[^\x22']+)([^\x22']+)[\x22|'].*>(?:</\1>)?

使用:

 preg_replace($pattern, $2, $comment);

评论:

Hi look at this!
<img src="http://www.mysite.com/blah/blah/image.jpg"></img>
<img src="http://mysite.com/blah/blah/image.jpg"></img>
<img src="http://subdomain.mysite.com/blah/blah/image.jpg"/>
<img src="http://www.mysite.fakesite.com/blah/blah/image.jpg"></img>
<img src="http://www.fakesite.com/blah/blah/image.jpg"></img>
<img src="http://fakesite.com/blah/blah/image.jpg"></img>
Which one is your favorite?

想要的结果:

 Hi look at this!
<img src="http://www.mysite.com/blah/blah/image.jpg"></img>
<img src="http://mysite.com/blah/blah/image.jpg"></img>
<img src="http://subdomain.mysite.com/blah/blah/image.jpg"/>
http://www.mysite.fakesite.com/blah/blah/image.jpg   (notice that it's just url, because it's not from my site)
http://www.fakesite.com/blah/blah/image.jpg
http://fakesite.com/blah/blah/image.jpg
Which one is your favorite?

有人发现有什么不对吗?

【问题讨论】:

    标签: php regex


    【解决方案1】:

    我正在尝试使用 preg_replace 过滤成员 cmets。过滤 script 和 img 标签。

    HTML Purifier 将是实现此目的的最佳工具,尽管您需要一个可接受标签和属性的白名单,而不是特定有害标签的黑名单。

    【讨论】:

    【解决方案2】:

    我能看到的最大错误是尝试使用正则表达式来修改 HTML。

    你应该使用DOMDOcument

    $dom = new DOMDocument('1.0', 'UTF-8');
    
    $dom->loadHTML($content);
    
    foreach($dom->getElementsByTag('img') as $element) {
    
        if ( ! $element->hasAttribute('src')) {
            continue;
        }
    
        $src = $element->getAttribute('src');
    
        $elementHost = parse_url($src, PHP_URL_HOST);
        $thisHost = $_SERVER['SERVER_NAME'];
    
        if ($elementHost != $thisHost) {
            $element->parentNode->insertBefore($dom->createTextNode($src), $element);
            $element->parentNode->removeChild($element);
        }
    
    }
    

    【讨论】:

      【解决方案3】:

      你应该使用即时通讯模式;

      #<(\w+).+src=[\x22|'](?![^\x22']+mysite\.com[^\x22']+)([^\x22']+)[\x22|'].*>(?:</\1>)?#im
      

      【讨论】:

        猜你喜欢
        • 2011-06-10
        • 1970-01-01
        相关资源
        最近更新 更多