如何删除所有以#开头的超链接?

时间:2016-05-20 作者:Mark Barnes

Facebook的即时文章拒绝包含指向当前页面超链接的文章(例如:。<a href="#_ftn1">[1]</a>). 在发布到Facebook即时文章之前,如何过滤帖子内容以删除这些链接?

我知道关于StackOverflow有一个类似的问题:How to remove hyperlink of images in wordpress post?, 但我的正则表达式技能还不足以将其转换为我所需要的。

PS-我正在使用半官方Instant Articles for WP, 这意味着我可以过滤instant_articles_content.

PPS-很高兴知道如何删除链接但保留链接文本,以及如何删除链接和链接文本。

3 个回复
最合适的回答,由SO网友:TheDeadMedic 整理而成

灵感来源于@Samuel Elh,但考虑了单引号或双引号属性以及href 这可能不是锚的第一个属性:

function wpse_227315_strip_hyperlinks( $content ) {
    preg_match_all( \'!<a[^>]*? href=[\\\'"]#[^<]+</a>!i\', $content, $matches );

    foreach ( $matches[0] as $link )
        $content = str_replace( $link, strip_tags( $link ), $content );

    return $content;
}

add_filter( \'the_content\', \'wpse_227315_strip_hyperlinks\' );
请注意,这将从帖子内容中完全删除链接节点/HTML这将仅用内部文本替换HTML链接。

SO网友:Paul Shryock

您可以使用Interconnectit DB Search/Replace Tool 搜索和替换数据库中字符串的所有实例。这可能无法完全解决您的问题,但您可以从搜索<a href="# 并将其替换为<a href=".

我不认为这正是你想要做的,但希望这是一个正确方向的开始。

SO网友:Ismail

尝试此功能:

function wpse_227315_strip_hyperlinks( $content ) { 

    preg_match_all( \'/<a href=\\\\"([^\\\\"]*)\\\\">(.*)<\\\\/a>/iU\', $content, $matches );

    foreach( $matches[0] as $link ) {

        preg_match_all(\'/(?<=href=\\").+(?=\\")/\', $link, $matches2);
        $href = isset( $matches2[0][0] ) ? $matches2[0][0] : false;

        if( 0 === strpos($href, \'#\') ) {

            $content = str_replace( $link, strip_tags($link), $content );
        }

    }

    return $content;

}
将其挂接到内容过滤器中,例如add_filter(tag_name, \'wpse_227315_strip_hyperlinks\'). 您应该卸下过滤器(使用remove_filter() e、 g级remove_filter(tag_name, \'wpse_227315_strip_hyperlinks\')) 在你发布到Facebook之后。