查找字符串中存在于数组中的字符并将其删除 - php

时间:2013-12-28 11:11:30

标签: php arrays string

假设我有以下字符串:$test ='abcd.gdda<fsa>dr';

以下数组:$array = array('<','.');

如何找到$ array数组中元素的字符位置? (尽可能快)然后存储并删除它们(不在该特定索引处留下NULL值)?

聚苯乙烯。我知道我可以使用strpos()来检查每个元素但是会输出类似于:9,5因为'&lt;'在“。”之前搜索符号。元素,这导致函数相信'&lt;'在''之前。在字符串中。我尝试将它与sort()函数结合起来...但是我没有按预期工作...(它输出一些NULL位置......)

5 个答案:

答案 0 :(得分:3)

适用于字符串和字符:

<?php
    $test ='abcda.gdda<fsa>dr';
    $array = array('<', '.', 'dr', 'a'); // not also characters but strings can be used
    $pattern = array_map("preg_quote", $array);
    $pattern = implode("|", $pattern);
    preg_match_all("/({$pattern})/", $test, $matches, PREG_OFFSET_CAPTURE);
    array_walk($matches[0], function(&$match) use (&$test)
    {
        $match = $match[1];
    });
    $test = str_replace($array, "", $test);
    print_r($matches[0]); // positions
    echo $test;

<强>输出

Array
(
    [0] => 0
    [1] => 4
    [2] => 5
    [3] => 9
    [4] => 10
    [5] => 13
    [6] => 15
)
bcdgddfs>

答案 1 :(得分:0)

这是一种可能的解决方案,取决于每个搜索元素是单个字符。

$array = array(',', '.', '<');
$string = 'fdsg.gsdfh<dsf<g,gsd';

$search = implode($array); $last = 0; $out = ''; $pos = array();
foreach ($array as $char) $pos[$char] = array();

while (($len = strcspn($string, $search)) !== strlen($string)) {
    $last = ($pos[$string[$len]][] = $last + $len) + 1;
    $out .= substr($string, 0, $len);
    $string = substr($string, $len+1);
}
$out.=$string;

演示:http://codepad.org/WAtDGr7p

答案 2 :(得分:0)

找到所有位置,将它们存储在数组中:

$test = 'abcd.gdda<fsa>dr<second . 111';
$array = array('<','.');
$positions = array();

foreach ($array as $char) {
    $pos = 0;
    while ($pos = strpos($test, $char, $pos)) {
        $positions[$char][] = $pos;
        $pos += strlen($char);
    }
}

print_r($positions);
echo str_replace($array, '', $test);

demo

答案 3 :(得分:0)

strtr($str, ['<' => '', '.' => '']);

这可能会胜过其他任何东西,因为它不需要你在PHP中迭代任何东西。

答案 4 :(得分:0)

编辑:
PHP有一个inbuild函数

str_replace($array, "", $test);

原始回答:
我将如何做到这一点:

<?php
$test ='abcd.gdda<fsa>dr';
$array = array('<','.');
foreach($array as $delimiter) {
  // For every delimiter explode the text into array and the recombine it
  $exploded_array = explode($delimiter, $test);
  $test = implode("", $exploded_array);
}
?>

有更快的方法(你将获得一些微秒),但如果你想要速度,为什么你会使用PHP :) 我大多喜欢简单。