微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

检查字符串是否仅由在另一个字符串中找到的字符组成

如何解决检查字符串是否仅由在另一个字符串中找到的字符组成

考虑样本数据,例如:

$str1 = "apple";
$str2 = "pal";

仅当 true 的所有字符 [字母字符] 也存在于 $str2 中时,我才想返回 $str1 响应,否则为 false

既然所有字母pal都存在于$str1中,那么结果应该是true

如果 $str2pole,那么会找到 ple,但不会找到 o。此场景应返回 false

我的伪代码是:

if (str2 is present in str1){
    // true;
    // since all characters of str2 are also in str1,so it should return true.
} else{
    // false;
}

解决方法

使用第一个字符串(白名单字符串)作为 trim() 的掩码。这将从第二个字符串中删除所有匹配的字符。如果修剪后还有剩余字符,则 false

因为 str2 的所有字符也在 str1 中,所以它应该返回 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() 更快(在微观层面上),但这些函数中的任何一个都会提供相同的输出。


附言如果您保证只能使用字母,那么您可以使用错误检查代替 strlen()

!trim($str2,$str1)

我这样说是因为如果允许数字,那么包含零的修剪字符串将被视为错误并返回错误结果。

,

您可以在使用 array_intersect 函数从单词中拆分每个字符后使用 str_split 函数:

<?php

$a = "Apple";
$b = "pal";

$matched = !empty(array_intersect(str_split($b),str_split($a))); 

array_intersect 将返回 [ p,l ] 由于大小写而忽略 'A' 敏感

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));

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。