如果在 haystack 中找到针,则字符串搜索函数为 return 布尔值
String search function to return boolean if needle is found in haystack
我正在编写一个简单的函数,它将包含 url 的字符串转换为可点击的 link。转换本身很简单,但如果字符串包含协议前缀之一,则基本验证的一部分似乎非常困难。
目前我的代码是这样的:
<?php
function link2code($link) {
if (stripos($link, 'http://' or 'https://' or 'ftp://' or 'ftps://') === true) {
return "<a href=\"$link\">$link</a>";
} else {
echo('Please provide whole link with protocol part, for example: http://myawesomewebsite.com');
}
}
echo link2code("http://127.0.0.1");
如您所见,我想要 return 布尔值来判断针是否在大海捞针中。我怎样才能实现它?
您可以通过定义自定义函数进行迭代并找到找到的 if 匹配创建一个 link。
function strPosition($haystack, $needle, $offset=0) {
if (!is_array($needle)) $needle = array($needle);
foreach ($needle as $query) {
if (strpos($haystack, $query, $offset) !== false) return true; // stop on first true result
}
return false;
}
function link2code($link) {
$array = array('http://', 'https://', 'ftp://', 'ftps://');
$match = strPosition($link, $array);
if ($match == true) {
return "<a href=\"$link\">$link</a>";
} else {
echo('Please provide whole link with protocol part, for example: http://myawesomewebsite.com');
}
}
检查此代码:
class Test
{
public function index()
{
$link = "http://127.0.0.1";
$this->checkLink("http://127.0.0.1"); //Yes
$this->checkLink("hsttp://127.0.0.1"); //No
}
private function checkLink($link)
{
if (stripos($link, 'http://') !== false
|| stripos($link, 'http://') !== false
|| stripos($link, 'ftp://') !== false
|| stripos($link, 'ftps://') !== false)
{
echo 'Yes';
}
else
{
echo 'No';
}
}
}
你可以使用 preg_match
:
if(preg_match("~^(ht|f)tps?://~i", $link)) { //...etc
可以使用正则表达式来完成。
尽管多次使用 stripos() 也可以。
排队的时间会更长,但可能会更便宜。
为了可读性,我更喜欢正则表达式
<?php
function link2code($link) {
if (preg_match('#^(https?|ftps?)://#i', $link)) {
return "<a href=\"$link\">$link</a>";
} else {
echo('Please provide whole link with protocol part, for example: http://myawesomewebsite.com');
}
}
echo link2code("http://127.0.0.1");
您可以尝试改写问题:
而不是检查 link 中的协议之一,而是尝试检查 link 中的协议是否是以下协议之一:
function link2code($link) {
$scheme = parse_url($link, PHP_URL_SCHEME);
if(!in_array($scheme,['http','https','ftp','ftps']) {
return "<a href=\"$link\">$link</a>";
} else {
echo ()
}
}
超出您的问题范围:
你的函数做不同的事情:
- 它验证 url
- 它returns string 或者它returns void
- 在某些情况下它会回声。
您可以尝试将验证与格式化分开,并确保您的函数始终 return 一个字符串,否则会引发异常。
function link2code($link) {
if(validateLink($link)) {
return "<a href=\"$link\">$link</a>";
} else {
throw new \Exception("Please provide whole link with protocol part, for example: http://myawesomewebsite.com'");
}
}
function validateLink($link) {
$scheme = parse_url($link, PHP_URL_SCHEME);
return in_array($scheme,['http','https','ftp','ftps']);
}
您可以使用 in_array()。
http://php.net/manual/en/function.in-array.php
function link2code($link) {
$arr = array('http:/', 'https:', 'ftp://', 'ftps:/');
If(in_array(substr($link,0,6), $arr)){
return "<a href=\"$link\">$link</a>";
} else {
echo('Please provide whole link with protocol part, for example: http://myawesomewebsite.com');
}
}
echo link2code("https://127.0.0.1");
https://3v4l.org/meI1r
该数组包含最小公共字符数 (6),以便我可以与函数中的相同字符进行比较。
所以 substr 将查看前六个字符,如果它们与数组不匹配,它不是唯一的 link 字符串。
意味着字符串 click here https://127.0.0.1
将失败
当然,如果您不需要验证它是一个 link 唯一字符串,您可以从代码中删除 substr 并在数组中添加 "full" 项。
尝试使用正则表达式和 preg_match
function link2code($link) {
if ( ! preg_match('/^(http(s)?|ftp(s)?):\/\//i', $link)) {
echo 'Please provide whole link with protocol part, for example: http://myawesomewebsite.com';
return FALSE;
}
return sprintf('<a href="%1$s">%1$s</a>', $link);
}
echo link2code("http://127.0.0.1");
echo link2code("https://127.0.0.1");
我正在编写一个简单的函数,它将包含 url 的字符串转换为可点击的 link。转换本身很简单,但如果字符串包含协议前缀之一,则基本验证的一部分似乎非常困难。
目前我的代码是这样的:
<?php
function link2code($link) {
if (stripos($link, 'http://' or 'https://' or 'ftp://' or 'ftps://') === true) {
return "<a href=\"$link\">$link</a>";
} else {
echo('Please provide whole link with protocol part, for example: http://myawesomewebsite.com');
}
}
echo link2code("http://127.0.0.1");
如您所见,我想要 return 布尔值来判断针是否在大海捞针中。我怎样才能实现它?
您可以通过定义自定义函数进行迭代并找到找到的 if 匹配创建一个 link。
function strPosition($haystack, $needle, $offset=0) {
if (!is_array($needle)) $needle = array($needle);
foreach ($needle as $query) {
if (strpos($haystack, $query, $offset) !== false) return true; // stop on first true result
}
return false;
}
function link2code($link) {
$array = array('http://', 'https://', 'ftp://', 'ftps://');
$match = strPosition($link, $array);
if ($match == true) {
return "<a href=\"$link\">$link</a>";
} else {
echo('Please provide whole link with protocol part, for example: http://myawesomewebsite.com');
}
}
检查此代码:
class Test
{
public function index()
{
$link = "http://127.0.0.1";
$this->checkLink("http://127.0.0.1"); //Yes
$this->checkLink("hsttp://127.0.0.1"); //No
}
private function checkLink($link)
{
if (stripos($link, 'http://') !== false
|| stripos($link, 'http://') !== false
|| stripos($link, 'ftp://') !== false
|| stripos($link, 'ftps://') !== false)
{
echo 'Yes';
}
else
{
echo 'No';
}
}
}
你可以使用 preg_match
:
if(preg_match("~^(ht|f)tps?://~i", $link)) { //...etc
可以使用正则表达式来完成。 尽管多次使用 stripos() 也可以。 排队的时间会更长,但可能会更便宜。
为了可读性,我更喜欢正则表达式
<?php
function link2code($link) {
if (preg_match('#^(https?|ftps?)://#i', $link)) {
return "<a href=\"$link\">$link</a>";
} else {
echo('Please provide whole link with protocol part, for example: http://myawesomewebsite.com');
}
}
echo link2code("http://127.0.0.1");
您可以尝试改写问题:
而不是检查 link 中的协议之一,而是尝试检查 link 中的协议是否是以下协议之一:
function link2code($link) {
$scheme = parse_url($link, PHP_URL_SCHEME);
if(!in_array($scheme,['http','https','ftp','ftps']) {
return "<a href=\"$link\">$link</a>";
} else {
echo ()
}
}
超出您的问题范围:
你的函数做不同的事情:
- 它验证 url
- 它returns string 或者它returns void
- 在某些情况下它会回声。
您可以尝试将验证与格式化分开,并确保您的函数始终 return 一个字符串,否则会引发异常。
function link2code($link) {
if(validateLink($link)) {
return "<a href=\"$link\">$link</a>";
} else {
throw new \Exception("Please provide whole link with protocol part, for example: http://myawesomewebsite.com'");
}
}
function validateLink($link) {
$scheme = parse_url($link, PHP_URL_SCHEME);
return in_array($scheme,['http','https','ftp','ftps']);
}
您可以使用 in_array()。
http://php.net/manual/en/function.in-array.php
function link2code($link) {
$arr = array('http:/', 'https:', 'ftp://', 'ftps:/');
If(in_array(substr($link,0,6), $arr)){
return "<a href=\"$link\">$link</a>";
} else {
echo('Please provide whole link with protocol part, for example: http://myawesomewebsite.com');
}
}
echo link2code("https://127.0.0.1");
https://3v4l.org/meI1r
该数组包含最小公共字符数 (6),以便我可以与函数中的相同字符进行比较。
所以 substr 将查看前六个字符,如果它们与数组不匹配,它不是唯一的 link 字符串。
意味着字符串 click here https://127.0.0.1
将失败
当然,如果您不需要验证它是一个 link 唯一字符串,您可以从代码中删除 substr 并在数组中添加 "full" 项。
尝试使用正则表达式和 preg_match
function link2code($link) {
if ( ! preg_match('/^(http(s)?|ftp(s)?):\/\//i', $link)) {
echo 'Please provide whole link with protocol part, for example: http://myawesomewebsite.com';
return FALSE;
}
return sprintf('<a href="%1$s">%1$s</a>', $link);
}
echo link2code("http://127.0.0.1");
echo link2code("https://127.0.0.1");