检查URL是否以http://开头并在没有时插入

14

我目前正在编辑一个带有自定义字段输出的WordPress主题。 我已经成功地进行了所有编辑,并且一切都按照预期工作。 我的问题是,如果将URL提交到自定义字段中,则回显恰好是其中的内容,因此如果有人输入 www.somesite.com ,则回显就是这个并将其添加到域的末尾:www.mysite.com www.somesite.com 。 我想检查所提供的链接是否以http://前缀开头,如果有,则不做任何处理,但如果没有,则在网址之前回显http://

我希望我已经很好地解释了我的问题。

$custom = get_post_meta($post->ID, 'custom_field', true);

<?php if ( get_post_meta($post->ID, 'custom_field', true) ) : ?>
    <a href="<?php echo $custom ?>"> <img src="<?php echo bloginfo('template_url');?>/lib/images/social/image.png"/></a>
    <?php endif; ?>

1
嗯,看起来你知道如何使用类和模板。即使你无法使用“RegEx”、“strncmp”或其他许多方法之一来完成此操作,你应该能够通过使用“substr”来解决这个问题。 - Dutchie432
https://dev59.com/7m855IYBdhLWcg3wMBLV - Sudhir Bastakoti
3个回答

79

parse_url() can help...

$parsed = parse_url($urlStr);
if (empty($parsed['scheme'])) {
    $urlStr = 'http://' . ltrim($urlStr, '/');
}

谢谢回复,但是有没有人可以给我展示一下所需代码在我的例子中的示例呢?我是一个完全的 PHP 新手,正在慢慢熟悉,但仍然遇到无尽的障碍。 - Rory Web Rothon
弄明白了,它现在能用了,只是我不理解“sceme”部分。这是什么啊哈哈 - Rory Web Rothon
4
你有没有尝试谷歌搜索 parse_url 来查看它返回的 scheme 是什么?parse_url 会返回一个键值对数组,具体请参考 "Return Values" 部分:http://php.net/manual/zh/function.parse-url.php。 - Dutchie432
2
这是一个很好的解决方案,因为它不会在大小写敏感或 https:// +1 的情况下失败。 - Dutchie432
ltrim()函数是用来做什么的? - Dale C. Anderson
显示剩余2条评论

8

您可以使用strpos()函数检查字符串开头是否为http://

$var = 'www.somesite.com';

if(strpos($var, 'http://') !== 0) {
  return 'http://' . $var;
} else {
  return $var;
}

如果变量的开头没有http://,则在其前面返回http://。否则,将返回$var本身。


5
如果大小写不匹配或URL以 https:// 开头,则此操作将失败。 - Dutchie432
在这种情况下,可以使用类似于if(!preg_match('#^https?://#', $var)){的逻辑。 - Sᴀᴍ Onᴇᴌᴀ

2
echo (strncasecmp('http://', $url, 7) && strncasecmp('https://', $url, 8) ? 'http://' : '') . $url;

请注意,strncmp()函数在前n个字母相等时返回0,这会被视为false。可能有点让人困惑。


使用字符串函数使处理大小写和https://变得比必要的更加困难。 - DaveRandom
1
看我的编辑。你可以假设这将是唯一可能出现的两种方案。无论如何,我已经为你的答案点赞,因为它显然更简洁。如果我重复它就没有意义了,因此我会留下我的一个作为另一种选择,它可能涵盖大多数情况,但“不够简洁”。现在情况也不相关。 - KingCrunch

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接