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