【问题标题】:Check if a string is solely composed of characters found in another string检查一个字符串是否仅由另一个字符串中的字符组成
【发布时间】:2021-10-04 18:46:38
【问题描述】:

考虑样本数据,例如:

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

仅当$str2 的所有字符[字母字符] 也出现在$str1 中时,我想返回true 响应,否则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;
}

【问题讨论】:

  • 你说的是单个字符还是分组字符?
  • 单个字符,位置随机。
  • 到目前为止你尝试过什么?你被困在哪里了?
  • 各位志愿者,这个问题不是不清楚。有一个伪编码尝试,所以这肯定不是我们在这里常见的帮助吸血鬼的最坏情况。是否可以对其进行更深入的研究并进行更好的编码尝试?当然,但这不是一个密切的原因。我不同意欺骗提名——我觉得它应该被撤回。如果此页面在没有更好的欺骗提名的情况下关闭,我将投票重新打开。
  • @mickmackusa 当然,先生。 :)

标签: php validation character matching whitelist


【解决方案1】:

使用第一个字符串(白名单字符串)作为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)

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

【讨论】:

  • 就像大师一样,先生。干净而简短。你是一个灵感。
  • 哇❤️ 非常感谢。这就是我一直在寻找的。​​span>
【解决方案2】:

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

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

【讨论】:

  • 这不是我想要的。即使一个字符匹配而其余字符不匹配,它也会给出真实的响应。我想要的是,只有当 str2 的所有字符都出现在 str1 中时,它才应该给出真实的响应。
  • !empty() 更简单地替换为(bool)
  • @Umar 那么你应该早点告诉。让我编辑。
【解决方案3】:

您可以使用count_chars() 获取每个字符串中当前字符的数组,然后比较这两个数组:

$s1 = 'apple';
$s2 = 'pal';

$c1 = count_chars($s1, 1);
$c2 = count_chars($s2, 1);

$ok = empty(array_diff_key($c2, $c1));

【讨论】:

  • empty() 适用于传入的变量/数据可能未声明的情况。在这种情况下,您肯定有某种数据empty() 可以替换为!
猜你喜欢
  • 2012-03-13
  • 2012-07-12
  • 1970-01-01
  • 1970-01-01
  • 2019-05-11
  • 1970-01-01
  • 2013-05-12
  • 2013-03-13
相关资源
最近更新 更多