首页 > 解决方案 > 了解 strpos、preg_replace 和 preg_match 函数

问题描述

我正在开发一个 WordPress 网站,并希望添加rel="noreferrer noopener"到所有外部链接。我找到了一个功能正是我想要的,但我想扩展它。我想要做的是如果链接有rel="nofollow",然后将其替换为rel="nofollow noopener noreferrer".

这是我正在处理的功能,我很难理解几个功能。我想了解他们,以便解决我的问题。

add_filter('the_content', 'rel_function');

function rel_function($content) {   
    return preg_replace_callback('/<a[^>]+/', 'rel_all_external_links', $content);  
}
 
function rel_all_external_links($Matches) {
    
    $externalLink = $Matches[0];
    $SiteLink = get_bloginfo('url');
 
    if (strpos($link, 'rel') === false)   {
        $externalLink = preg_replace("%(href=\S(?!$SiteLink))%i", 'rel="noopener noreferrer" target="_blank" $1', $externalLink);
    } elseif (preg_match("%href=\S(?!$SiteLink)%i", $externalLink)) {
        $externalLink = preg_replace('/rel=\S(?!nofollow)\S*/i', 'rel="noopener noreferrer" target="_blank"', $externalLink);
    } 

    return $externalLink;
 
}

我不明白的第一件事是if (strpos($link, 'rel') === false)。怎么会$link是未定义的?我不明白如何strpos获得这个变量的价值?如果链接没有,这会返回 true'rel'吗?

第二个是$externalLink = preg_replace("%(href=\S(?!$SiteLink))%i", 'rel="noopener noreferrer" target="_blank" $1', $externalLink); 如果我理解正确,preg_replace检查是否$extenalLink不包含基本 URL 并替换所有字符串,除了href="..."? 那是对的吗?

最后一个:

elseif (preg_match("%href=\S(?!$SiteLink)%i", $externalLink)) {
        $externalLink = preg_replace('/rel=\S(?!nofollow)\S*/i', 'rel="noopener noreferrer" target="_blank"', $externalLink);
    } 

它会检查是否$externalLink没有基本 URL,对吗?我不确定preg_replace这里要做什么,但我认为这是我问题的关键。

我将不胜感激任何帮助。

标签: php

解决方案


strpos是一个函数,可让您查找您提供的字符串中是否存在特定单词或字符组合。这就像是/否,另外,它可以给你它的开始位置。需要注意的是,当没有找到任何东西或一个数字时它会返回false,包括找到匹配时的0。

所以这个功能非常适合简单的场景,比如单词app中有字母apple吗?答案是肯定的,起始位置为 0。

在示例中,您提供if (strpos($link, 'rel') === false)它搜索单词 rel 是否存在,在什么位置并不重要。

preg_match用于使用正则表达式进行非常复杂的搜索,能够搜索多个条件、组等。举一个它可以搜索的例子:apprehensive它以 ? 开头app和结尾的单词sive?- 回答是。如果strpos会被使用,它会因为app存在而对所有此类情况说“是”,但永远不会检查结局,因为它无法做到这一点。preg_match通常可用于获取属性内部的内容,因此它获取 rel="[what's here]"。

Preg_replace正在使用正则表达式替换某些内容以进行复杂搜索,然后替换匹配项。

我总是建议阅读 php 为函数提供的文档,它是可接受的参数。

关于 strpos 的信息

关于 preg_replace 的信息

关于 preg_match 的信息

有关正则表达式的信息(需要很长时间才能学习!)


推荐阅读