php - 了解 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
这里要做什么,但我认为这是我问题的关键。
我将不胜感激任何帮助。
解决方案
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 为函数提供的文档,它是可接受的参数。
推荐阅读
- google-cloud-bigtable - 从 Bigtable 导入表 - Google 云
- python - 从 settings.py 文件夹内的应用程序设置 AUTH_USER_MODEL
- excel - excel:查找每个组的最大日期的 total_log
- angularjs - 具有不同颜色AngularJs的clr-checkbox动态复选框集
- php - 我得到了似乎是一个无限循环的东西,无法弄清楚为什么 - PHP/WordPress
- cloudera - Cloudera Post 部署配置更新
- vue.js - Vuejs webpack 中 App.vue 与其他组件的关系
- aspnetboilerplate - 后台作业因“当前用户未登录应用程序”而失败
- python - 如何在python中的图像上设置水印文本
- flask - axios 使用烧瓶和 vuejs 发布多个数据