繁体   English   中英

了解 strpos、preg_replace 和 preg_match 函数

[英]Understanding strpos, preg_replace, and preg_match functions

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

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

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如何为这个变量获取价值? 如果链接没有'rel' ,这是否返回 true ?

第二个是$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在这里试图做什么,但我认为这是我问题的关键。

我将不胜感激任何帮助。

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

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

在示例中,您提供了if (strpos($link, 'rel') === false)它会搜索单词 rel 是否存在,并且在 position 中是否存在无关紧要。

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

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

我总是建议阅读 php 提供的功能文档,它已被接受 arguments。

关于 strpos 的信息

关于 preg_replace 的信息

关于 preg_match 的信息

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM