按正确的顺序查找字符串数组中的常用字符

时间:2010-01-29 10:23:38

标签: php string wildcard

我花了几天时间研究一个函数,以正确的顺序在一个字符串数组中获取常用字符,以创建一个通配符。

这是一个解释我的问题的例子。我做了大约3个函数,但是当每个字母的绝对位置不同时,我总是有一个错误。

我们假设“+”是“通配符”:

Array(
0 => '48ca135e0$5',
1 => 'b8ca136a0$5',
2 => 'c48ca13730$5',
3 => '48ca137a0$5');

应该返回:

$wildcard='+8ca13+0$5';

在这个例子中,棘手的是$array[2]比其他人更多。{/ p>

其他例子:

Array(
0 => "case1b25.occHH&FmM",
1 => "case11b25.occHH&FmM",
2 => "case12b25.occHH&FmM",
3 => "case20b25.occHH&FmM1");

应该返回:

$wildcard='case+b25.occHH&FmM+';

在这个例子中,棘手的部分是:
  - 重复字符,例如1 - > 11中的“删除”部分,和c - > cc在共同部分中   - $ array中的“2”字符[2]& [3]中的“删除”部分不在同一位置
  - 最后一个字符串末尾的“1”字符

我真的需要帮助,因为我找不到这个功能的解决方案,而且它是我应用程序的主要部分。

在此先感谢,不要犹豫提问,我会尽快回答。

Mykeul

2 个答案:

答案 0 :(得分:3)

似乎你想从一组示例字符串中创建类似正则表达式的东西。 这一般来说可能非常棘手。找到此链接,不确定它是否相关: http://scholar.google.com/scholar?hl=en&rlz=1B3GGGL_enEE351EE351&q=%22regular%20expression%20by%20example%22&oq=&um=1&ie=UTF-8&sa=N&tab=ws

另一方面,如果您只需要一个特定的通配符,意思是“0或更多字符”,那么它应该更容易。 Levenshtein distance算法计算2个字符串之间的相似性。通常只需要结果,但在您的情况下,差异的位置很重要。您还需要对N字符串进行调整。

所以我建议研究这个算法,希望你能得到一些解决问题的想法(至少你会得到一些文本算法和动态编程的练习)。

PHP中的Heres算法: _http://en.wikibooks.org/wiki/Algorithm_Implementation/Strings/Levenshtein_distance#PHP

您可能还想搜索“diff”的PHP实现。 http://paulbutler.org/archives/a-simple-diff-algorithm-in-php/

答案 1 :(得分:2)

主要代码:
步骤1:按长度(最短到最长)对字符串排序为数组[]
第2步:比较数组[0]和数组[1]中的字符串以获取$ temp_wildcard
步骤3:将数组[2]中的字符串与$ temp_wildcard进行比较,以创建新的$ temp_wildcard
第4步:继续将每个字符串与$ temp_wildcard进行比较 - 最后一个$通配符是你的$ temp_wildcard

好的,现在我们讨论如何比较两个字符串以返回通配符字符串的问题。

子程序代码: 逐个字符地比较字符串,当比较不匹配时,将通配符替换为返回值。

要处理不同长度的问题,请为第二个字符串较长且具有偏移量的每个字符运行此比较一个额外时间。 (将string1 [x]与string2 [x + offset]进行比较。)对于每个返回的字符串,计算通配符的数量。子例程应该返回最少数量的通配符的答案。

祝你好运!