检查一个字符串是否仅由在另一个字符串中找到的字符组成
Check if a string is solely composed of characters found in another string
考虑示例数据,例如:
$str1 = "apple";
$str2 = "pal";
我想 return 仅当 $str2
的所有字符 [字母字符] 也出现在 $str1
中时才 true
响应,否则 [=15] =].
由于所有字母p
、a
、l
都存在于$str1
中,那么结果应该是true
.
如果 $str2
是 pole
,那么会找到 p
、l
和 e
,但是 o
会不是。这个场景应该returnfalse
.
我的伪代码是:
if (str2 is present in str1){
// true;
// since all characters of str2 are also in str1, so it should return true.
} else{
// false;
}
您可以将 array_intersect function after splitting each characters from a word using the str_split 函数用作:
<?php
$a = "Apple";
$b = "pal";
$matched = !empty(array_intersect(str_split($b), str_split($a)));
array_intersect will return [ p, l ] ignoring 'A' due to case
sensitive
echo $matched; // true
?>
如果您想匹配忽略字符的大小写,那么您可以先使用 strtolower 函数将单词小写:然后拆分为:
$a = "Apple";
$a = strtolower($a);
您可以使用 count_chars() 获取每个字符串中当前字符的数组,然后比较这两个数组:
$s1 = 'apple';
$s2 = 'pal';
$c1 = count_chars($s1, 1);
$c2 = count_chars($s2, 1);
$ok = empty(array_diff_key($c2, $c1));
使用第一个字符串(白名单字符串)作为 trim()
的掩码。这将从第二个字符串中删除所有匹配的字符。如果 trim 之后还有任何字符,则 false
.
since all characters of str2 are also in str1, so it should return true
代码:(Demo)
$str1 = "apple";
$str2 = "pal";
$str3 = "pole";
var_export(!strlen(trim($str2, $str1)));
echo "\n---\n";
var_export(!strlen(trim($str3, $str1)));
输出:
true
---
false
这个答案干净直接,因为它不需要为后续比较生成临时数组。 trim()
的字符掩码提供与 str_replace()
著名的相同操作,但不需要先将白名单字符串拆分为数组。我不知道 ltrim()
或 rtrim()
是否会比 trim()
更快(在微观层面上),但这些函数中的任何一个都将提供相同的输出。
p.s。如果你保证只使用字母,那么你可以使用错误检查而不是strlen()
。
!trim($str2, $str1)
我这样说是因为如果你允许数字,那么包含零的 trimmed 字符串将被认为是错误的并且 return 是不正确的结果。
考虑示例数据,例如:
$str1 = "apple";
$str2 = "pal";
我想 return 仅当 $str2
的所有字符 [字母字符] 也出现在 $str1
中时才 true
响应,否则 [=15] =].
由于所有字母p
、a
、l
都存在于$str1
中,那么结果应该是true
.
如果 $str2
是 pole
,那么会找到 p
、l
和 e
,但是 o
会不是。这个场景应该returnfalse
.
我的伪代码是:
if (str2 is present in str1){
// true;
// since all characters of str2 are also in str1, so it should return true.
} else{
// false;
}
您可以将 array_intersect function after splitting each characters from a word using the str_split 函数用作:
<?php
$a = "Apple";
$b = "pal";
$matched = !empty(array_intersect(str_split($b), str_split($a)));
array_intersect will return [ p, l ] ignoring 'A' due to case sensitive
echo $matched; // true
?>
如果您想匹配忽略字符的大小写,那么您可以先使用 strtolower 函数将单词小写:然后拆分为:
$a = "Apple";
$a = strtolower($a);
您可以使用 count_chars() 获取每个字符串中当前字符的数组,然后比较这两个数组:
$s1 = 'apple';
$s2 = 'pal';
$c1 = count_chars($s1, 1);
$c2 = count_chars($s2, 1);
$ok = empty(array_diff_key($c2, $c1));
使用第一个字符串(白名单字符串)作为 trim()
的掩码。这将从第二个字符串中删除所有匹配的字符。如果 trim 之后还有任何字符,则 false
.
since all characters of str2 are also in str1, so it should return true
代码:(Demo)
$str1 = "apple";
$str2 = "pal";
$str3 = "pole";
var_export(!strlen(trim($str2, $str1)));
echo "\n---\n";
var_export(!strlen(trim($str3, $str1)));
输出:
true
---
false
这个答案干净直接,因为它不需要为后续比较生成临时数组。 trim()
的字符掩码提供与 str_replace()
著名的相同操作,但不需要先将白名单字符串拆分为数组。我不知道 ltrim()
或 rtrim()
是否会比 trim()
更快(在微观层面上),但这些函数中的任何一个都将提供相同的输出。
p.s。如果你保证只使用字母,那么你可以使用错误检查而不是strlen()
。
!trim($str2, $str1)
我这样说是因为如果你允许数字,那么包含零的 trimmed 字符串将被认为是错误的并且 return 是不正确的结果。