Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
删除特定URL域php的标记_Php_Regex_Preg Match All - Fatal编程技术网

删除特定URL域php的标记

删除特定URL域php的标记,php,regex,preg-match-all,Php,Regex,Preg Match All,这是一个脚本代码,不是我的,我试图修改它。它所做的是搜索所有标签,然后删除它们。如何修改代码以仅删除给定域或url的标记?例如,删除域标记:www.domainurl.com,删除所有标记,如下所示: <a href="https://www.domainurl.com/refer/google-adsense/">fsdf</a> <a title="Google Adsense" href="https://www.domainurl.com/

这是一个脚本代码,不是我的,我试图修改它。它所做的是搜索所有标签,然后删除它们。如何修改代码以仅删除给定域或url的标记?例如,删除域标记:www.domainurl.com,删除所有标记,如下所示:

     <a href="https://www.domainurl.com/refer/google-adsense/">fsdf</a>
    <a title="Google Adsense" href="https://www.domainurl.com/refer/google-adsense/" target="_blank" rel="nofollow noopener">fgddf</a>
    <a href="https://www.domainurl.com/page/pago">domain </a>
<a title="Google Adsense" href="https://www.googlead.com/refer/google-adsense/" target="_blank" rel="nofollow noopener">googled</a>
结果如下所示:

fsdf
fgddf
domain
<a title="Google Adsense" href="https://www.googlead.com/refer/google-adsense/" target="_blank" rel="nofollow noopener">google</a>
代码如下:

if (in_array ( 'OPT_STRIP', $camp_opt )) {
                          echo '<br>Striping links ';

                        //$abcont = strip_tags ( $abcont, '<p><img><b><strong><br><iframe><embed><table><del><i><div>' );


                        preg_match_all('{<a.*?>(.*?)</a>}' , $abcont , $allLinksMatchs);


                        $allLinksTexts    = $allLinksMatchs[1];
                        $allLinksMatchs=$allLinksMatchs[0];


                        $j = 0;
                        foreach ($allLinksMatchs as $singleLink){

                            if(! stristr($singleLink, 'twitter.com'))
                            $abcont = str_replace($singleLink, $allLinksTexts[$j], $abcont);

                            $j++;
                        }
}
我尝试过这样做,但对我来说不起作用:

正则表达式:

使用preg_match_all在搜索中指定

 preg_match_all('{<a.*?[^>]* href="((https?:\/\/)?([\w\-])+\.{1}domainurl\.([a-z]{2,6})([\/\w\.-]*)*\/?)">(.*?)</a>}' , $abcont , $allLinksMatchs);

有什么想法吗,如果您的HTML包含在以下变量中,我将非常感谢您

的使用应该是一个更好的选择,这里有一个函数可以帮助您:

函数removeLinkTagsOfDomain$html$domain{ //转义所有正则表达式特殊字符 $domain=preg_quote$domain; //搜索具有href属性且包含指定域的标记 $pattern='/.+/'; //最终替换应该是标记的文本节点 $replacer='$1'; 返回preg_replace$pattern,$1',$html; } //用法: $domains=[…]; $html='…'; foreach$域作为$d{ $html=removeLinkTagsOfDomain$html,$d; }
假设您的HTML包含在以下变量中

的使用应该是一个更好的选择,这里有一个函数可以帮助您:

函数removeLinkTagsOfDomain$html$domain{ //转义所有正则表达式特殊字符 $domain=preg_quote$domain; //搜索具有href属性且包含指定域的标记 $pattern='/.+/'; //最终替换应该是标记的文本节点 $replacer='$1'; 返回preg_replace$pattern,$1',$html; } //用法: $domains=[…]; $html='…'; foreach$域作为$d{ $html=removeLinkTagsOfDomain$html,$d; } 那么:

<a.*? href=\".*www\.googlead\.com.*\">(.*?)<\/a>
因此,它变成:

preg_match_all('{<a.*? href=\".*www\.googlead\.com.*\">(.*?)<\/a>}' , $abcont , $allLinksMatchs);
这只会从www.googlead.com中删除一个标签

您可以检查正则表达式结果。

关于:

<a.*? href=\".*www\.googlead\.com.*\">(.*?)<\/a>
因此,它变成:

preg_match_all('{<a.*? href=\".*www\.googlead\.com.*\">(.*?)<\/a>}' , $abcont , $allLinksMatchs);
这只会从www.googlead.com中删除一个标签

您可以检查regex结果。

而不是尝试,正如您所建议的,我选择使用DOMDocument类

function remove_domain($str, $domainsToRemove)
{
    $domainsToRemove = is_array($domainsToRemove) ? $domainsToRemove : array_slice(func_get_args(), 1);

    $dom = new DOMDocument;
    $dom->loadHTML("<div>{$str}</div>", LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);

    $anchors = $dom->getElementsByTagName('a');
    // Code taken and modified from: http://php.net/manual/en/domnode.replacechild.php#50500
    $i = $anchors->length - 1;
    while ($i > -1) {
        $anchor = $anchors->item($i);

        foreach ($domainsToRemove as $domain) {
            if (strpos($anchor->getAttribute('href'), $domain) !== false) {
                // $new = $dom->createElement('p', $anchor->textContent);
                $new = $dom->createTextNode($anchor->textContent);

                $anchor->parentNode->replaceChild($new, $anchor);
            }
        }

        $i--;
    }

    // Create HTML string, then remove the wrapping div.
    $html = $dom->saveHTML();
    $html = substr($html, 5, strlen($html) - (strlen('</div>') + 1) - strlen('<div>'));

    return $html;
}
首先,我已经将您的字符串存储在一个变量中,但这只是为了我可以利用它来获得答案;将$str替换为从何处获取代码

该函数接受一个HTML字符串,但需要一个子元素——因此我将该字符串包装在一个div中

while循环将遍历锚元素,然后用锚标记的内容替换任何与指定域匹配的元素。 注意,我在这一行上面留下了一条评论,你可以用它来代替。这将用p标记替换锚元素,p标记将具有默认的显示样式:block;这意味着您的布局不太可能被破坏。然而,由于预期的输出只是文本节点,所以我将此作为一个选项

正如您所建议的,我没有尝试,而是选择使用DOMDocument类

function remove_domain($str, $domainsToRemove)
{
    $domainsToRemove = is_array($domainsToRemove) ? $domainsToRemove : array_slice(func_get_args(), 1);

    $dom = new DOMDocument;
    $dom->loadHTML("<div>{$str}</div>", LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);

    $anchors = $dom->getElementsByTagName('a');
    // Code taken and modified from: http://php.net/manual/en/domnode.replacechild.php#50500
    $i = $anchors->length - 1;
    while ($i > -1) {
        $anchor = $anchors->item($i);

        foreach ($domainsToRemove as $domain) {
            if (strpos($anchor->getAttribute('href'), $domain) !== false) {
                // $new = $dom->createElement('p', $anchor->textContent);
                $new = $dom->createTextNode($anchor->textContent);

                $anchor->parentNode->replaceChild($new, $anchor);
            }
        }

        $i--;
    }

    // Create HTML string, then remove the wrapping div.
    $html = $dom->saveHTML();
    $html = substr($html, 5, strlen($html) - (strlen('</div>') + 1) - strlen('<div>'));

    return $html;
}
首先,我已经将您的字符串存储在一个变量中,但这只是为了我可以利用它来获得答案;将$str替换为从何处获取代码

该函数接受一个HTML字符串,但需要一个子元素——因此我将该字符串包装在一个div中

while循环将遍历锚元素,然后用锚标记的内容替换任何与指定域匹配的元素。 注意,我在这一行上面留下了一条评论,你可以用它来代替。这将用p标记替换锚元素,p标记将具有默认的显示样式:block;这意味着您的布局不太可能被破坏。然而,由于预期的输出只是文本节点,所以我将此作为一个选项


那么您是否收到了元素列表,每行一个?或者这些元素是否也与其他元素一起嵌入到一些HTML代码中?我怎么强调用正则表达式解析HTML有多糟糕。。。那么,你是否收到了一个元素列表,每行一行?或者这些元素是否也与其他元素一起嵌入到一些HTML代码中?我怎么强调用正则表达式解析HTML有多糟糕。。。想想我的只是一个例子,他可以用www. DounurURL.他不想保留它,他确实想删除来自特定域的所有标记。如果将格式错误的HTML传递给此正则表达式,则它将与此模式匹配。例如,他会成功匹配你的表达式。我的只是一个例子,他可以用www.domainurl.com替换它。他不想保留它,他确实想删除来自特定域的所有标记。如果将格式错误的HTML传递给此正则表达式,则它将与此模式匹配。例如,将成功匹配表达式。是否在同一行中使用多个标记进行了尝试?或者,如果单个标记在多行上分解,您尝试过吗
它在同一行中有多个标签?或者,如果一个标记在多行上分解,那么可以将多个域而不是一个域放在一起:$domainToRemove='domainurl.com',google.com','domainxd.com';那么这是正确的吗?@juan我已经更新了答案,这样现在你就可以删除多个URL了。有一些想法可以放几个域名,而不仅仅是一个:$domainToRemove='domainurl.com',google.com','domainxd.com';那么这是正确的吗?@juan我已经更新了答案,现在你可以删除多个URL。