在PHP中搜索单个字符串中的不同字符串数组
我有一个字符串数组,我想尝试与普通字符串的结尾匹配。我不确定在PHP中实现这一点的最佳方法 这就是我想做的: 例如: 投入:abcde 搜索数组:er、wr、de 对手:德 我的第一个想法是编写一个循环,通过在每个字符串的末尾添加“\b”来遍历数组并构造一个正则表达式,然后检查是否在输入字符串中找到它。虽然这样做可行,但在整个阵列中循环似乎效率很低。有人告诉我,正则表达式在PHP中速度很慢,不想实现会让我走错方向的东西 有没有更好的方法来查看数组中的一个字符串是否出现在输入字符串的末尾在PHP中搜索单个字符串中的不同字符串数组,php,regex,arrays,search,Php,Regex,Arrays,Search,我有一个字符串数组,我想尝试与普通字符串的结尾匹配。我不确定在PHP中实现这一点的最佳方法 这就是我想做的: 例如: 投入:abcde 搜索数组:er、wr、de 对手:德 我的第一个想法是编写一个循环,通过在每个字符串的末尾添加“\b”来遍历数组并构造一个正则表达式,然后检查是否在输入字符串中找到它。虽然这样做可行,但在整个阵列中循环似乎效率很低。有人告诉我,正则表达式在PHP中速度很慢,不想实现会让我走错方向的东西 有没有更好的方法来查看数组中的一个字符串是否出现在输入字符串的末尾 preg
preg_filter()函数看起来可以完成这项工作,但它适用于PHP5.3+,我仍然坚持使用5.2.11稳定的函数。对于这样简单的函数,您不需要正则表达式。您可以在阵列上循环,并使用strpos查看索引是否为length(输入)-length(测试)。如果搜索数组中的每个条目的长度总是恒定的,那么也可以通过切掉输入的结尾,然后将其与数组中的每个条目进行比较来加快速度
您无法避免遍历整个数组,因为在最坏的一般情况下,匹配的项将位于数组的末尾。但是,除非阵列很大,否则我不会太担心性能-它将比您想象的快得多。对于这样简单的事情,您不需要正则表达式。您可以在阵列上循环,并使用strpos查看索引是否为length(输入)-length(测试)。如果搜索数组中的每个条目的长度总是恒定的,那么也可以通过切掉输入的结尾,然后将其与数组中的每个条目进行比较来加快速度
您无法避免遍历整个数组,因为在最坏的一般情况下,匹配的项将位于数组的末尾。但是,除非数组很大,否则我不会太担心性能-它会比您想象的快得多。尽管编译正则表达式需要一些时间,但我不会轻易放弃使用pcre。除非您找到一个需要几个针的比较函数,否则您需要针的循环,执行循环+调用每个针的比较函数也需要时间 让我们看一个测试脚本,它从php.net获取所有函数名并查找某些结尾。这只是一个临时脚本,但我想无论使用哪个strcmp ish函数+循环,它都会比简单的pcre模式(在本例中)慢 这是搜索九种不同模式的结果。如果只有两个('yadda','ge'),则两种方法都需要相同的时间 请随意批评测试脚本(在合成测试中,除了你自己之外,不总是有明显的错误吗?;-)
尽管编译正则表达式需要一些时间,但我不会轻易放弃使用pcre。除非您找到一个需要几个针的比较函数,否则您需要针的循环,执行循环+调用每个针的比较函数也需要时间
让我们看一个测试脚本,它从php.net获取所有函数名并查找某些结尾。这只是一个临时脚本,但我想无论使用哪个strcmp ish函数+循环,它都会比简单的pcre模式(在本例中)慢
这是搜索九种不同模式的结果。如果只有两个('yadda','ge'),则两种方法都需要相同的时间
请随意批评测试脚本(在合成测试中,除了你自己之外,不总是有明显的错误吗?;-)
我可能会向后看
如果字符串结尾列表是固定的或很少变化,
我会先对其进行预处理,使其易于匹配,
然后抓住绳子的末端,看看是否匹配
示例代码:
<?php
// Test whether string ends in predetermined list of suffixes
// Input: string to test
// Output: if matching suffix found, returns suffix as string, else boolean false
function findMatch($str) {
$matchTo = array(
2 => array( 'ge' => true, 'de' => true ),
3 => array( 'foo' => true, 'bar' => true, 'baz' => true ),
4 => array( 'abcd' => true, 'efgh' => true )
);
foreach($matchTo as $length => $list) {
$end = substr($str, -$length);
if (isset($list[$end]))
return $end;
}
return $false;
}
?>
我可能会向后看
如果字符串结尾列表是固定的或很少变化,
我会先对其进行预处理,使其易于匹配,
然后抓住绳子的末端,看看是否匹配
示例代码:
<?php
// Test whether string ends in predetermined list of suffixes
// Input: string to test
// Output: if matching suffix found, returns suffix as string, else boolean false
function findMatch($str) {
$matchTo = array(
2 => array( 'ge' => true, 'de' => true ),
3 => array( 'foo' => true, 'bar' => true, 'baz' => true ),
4 => array( 'abcd' => true, 'efgh' => true )
);
foreach($matchTo as $length => $list) {
$end = substr($str, -$length);
if (isset($list[$end]))
return $end;
}
return $false;
}
?>
这可能有些过分,但您可以尝试以下方法。
为搜索数组的每个条目创建一个哈希,并将它们作为键存储在数组中(这将是您的查找数组)
然后从输入字符串的末尾开始,每次输入一个字符(e、de、cde等),并在每次迭代时计算子字符串上的哈希值。如果查找数组中有散列,则有很多。这可能有些过分,但您可以尝试以下方法。
为搜索数组的每个条目创建一个哈希,并将它们作为键存储在数组中(这将是您的查找数组)
然后从输入字符串的末尾开始,每次输入一个字符(e、de、cde等),并在每次迭代时计算子字符串上的哈希值。如果查找数组中有一个散列,那么就有很多。搜索数组:er,wr,de
-它们的长度总是相同的吗?或者它们也可能是类似于er,a,xyz
?这种优化有多“重要”?这真的是应用程序中的瓶颈吗?搜索数组中的项目大小不同。我在找几百个。结果已缓存,但我仍希望最小化工作量。搜索数组:er,wr,de
-它们的长度是否始终相同,或者是否也可以是类似于er,a,xyz
?这种优化有多“重要”?这真的是应用程序中的瓶颈吗?搜索数组中的项目大小不同。我在找几百个。结果已缓存,但我仍希望最小化工作量。谢谢!我知道一定有更简单的方法。谢谢!我知道一定有更简单的办法。
<?php
// Test whether string ends in predetermined list of suffixes
// Input: string to test
// Output: if matching suffix found, returns suffix as string, else boolean false
function findMatch($str) {
$matchTo = array(
2 => array( 'ge' => true, 'de' => true ),
3 => array( 'foo' => true, 'bar' => true, 'baz' => true ),
4 => array( 'abcd' => true, 'efgh' => true )
);
foreach($matchTo as $length => $list) {
$end = substr($str, -$length);
if (isset($list[$end]))
return $end;
}
return $false;
}
?>