从字符串中删除黑名单词汇,然后消除不必要的空格。

5
我有一个黑名单术语的数组:
$arrayBlacklist = array("Kota","Kab.","Kota Administrasi","KAB", "KOTA", "Kabupaten");

我需要对一个字符串进行清理:

$city = "Kota Jakarta Selatan";
// also: "Kab. Jakarta Selatan", "Kota Administrasi Jakarta Selatan", ...

我只想在$city变量中包含$arrayBlacklist值的情况下将其删除。

因此,我得到$city =“Jakarta Selatan”


你也想处理空格吗? - nice_dev
1
是的,.. @vivek_23 - Muamar Humaidi
4个回答

3
$arrayBlacklist = array("Kota Administrasi", "Kota","Kab.","KAB", "KOTA", "Kabupaten");
rsort($arrayBlacklist);
$city = "Kota Jakarta Selatan";
        
$city = trim(preg_replace('/\s+/', ' ',str_replace($arrayBlacklist, '', $city)));

你可以使用 https://www.php.net/manual/zh/function.str-replace.php str_replace 可以使用数组作为搜索和替换语句。

1
删除后修剪空格。编辑:还有一个问题,需要解决:如果删除了“Kota Jakarta Selatan”,则结果字符串中单词之间将有双倍空格。“Kota Selatan” - user3532758
但是当我更改$city =“ Kota Administrasi Jakarta Selatan”的值时,它只是删除了“ Kota”,当我打印$city时,我只得到“Administrasi Jakarta Selatan”? - Muamar Humaidi
rsort()与基于长度排序不同。 - nice_dev
但是,对于像“Kota Administrasi”、“Kota”这样的值数组进行排序就足够了。最长的值总是排在第一位。 - V-K
1
@V-K 你确定最长的总是第一个吗?http://sandbox.onlinephpfunctions.com/code/734d4a27bb4485a4d5359b807e3affb7bb3af1fe - nice_dev
显示剩余7条评论

2
  • 使用usort根据字符串长度对数组进行排序,以避免重叠问题。
  • 不区分大小写的方式preg_replace每个字符串。
  • 最后,使用str_replace将所有双空格替换为单空格。

代码片段:

<?php

$arrayBlacklist = array("Kota","Kab.","Kota Administrasi","KAB", "KOTA", "Kabupaten","Jakarta");

usort($arrayBlacklist,function($a,$b){
    return strlen($b) <=> strlen($a);
});


$city = "Kota Jakarta Selatan kota Administrasi ki";
$city = " ". $city. " "; // add spaces to ease the matching

foreach($arrayBlacklist as $val){
   $city = preg_replace('/\s'.$val.'\s/i','  ',$city); // replace with double spaces to avoid recursive matching
}

$city = str_replace("  "," ",trim($city));
echo $city;

更新:

preg_replace会将字符串视为被空格包围的字符串,因为在黑名单字符串中有时也会有非单词字符。为了简化匹配过程,在循环开始前我们故意添加前导和尾随空格。

注意:我们使用双空格替换preg_replace中匹配的字符串,以避免与其他字符串递归匹配。


@MuamarHumaidi 在哪个输入上? - nice_dev
如果 $city = "Kab. Jakarta Selatan",并且使用 $city = preg_replace('/\s'.$val.'\s/i',' ',$city); 将只得到 'Selatan',... @vivek_23 - Muamar Humaidi
@MuamarHumaidi 这会导致问题,相信我。另外,你在哪个输入上得到了错误的输出? - nice_dev
@MuamarHumaidi 这是因为Jakarta在我的黑名单数组中。根据您的要求将其删除即可。 - nice_dev
$arrayBlacklist = array("Kota","Kab.","Kota Administrasi","KAB.", "KOTA", "Kabupaten"); usort($arrayBlacklist,function($a,$b){ return strlen($b) <=> strlen($a); }); $city = "Kab. Jakarta Selatan"; foreach($arrayBlacklist as $val){ $city = preg_replace('/'.$val.'/i','',$city); } $city = str_replace(" "," ",trim($city)); echo $city; - Muamar Humaidi
显示剩余3条评论

0

我认为strtr()是这项工作的最佳工具,因为:

  1. 您不需要预先对黑名单数组进行排序
  2. 替换时,较长的匹配项将优先于较短的匹配项。

因此,您可以有效地“翻译”,然后修剪前导/尾随空格,然后删除任何内部冗余空格。

代码:(演示

$arrayBlacklist = ["Kota Administrasi", "Kota","Kab.","KAB", "KOTA", "Kabupaten"];
$trans = array_fill_keys($arrayBlacklist, '');

$cities = [
    "Kota Jakarta Selatan",
    "Kota Administrasi Selatan",
    "Kab. What Kota Kab.",
    "KOTA Kota Coca Cola",
];
        
foreach ($cities as $city) {
    var_export(
        preg_replace('/\s{2,}/', ' ', trim(strtr($city, $trans)))
    );
    echo "\n";
}

输出:

'Jakarta Selatan'
'Selatan'
'What'
'Coca Cola'

0

这个答案不如其他的优雅,但可以完成任务。

$arrayBlacklist = ['Kota', 'Kab.', 'Kota Administrasi', 'KAB', 'KOTA', 'Kabupaten'];
$city = 'Kota Jakarta Selatan'; 

// make an array of words from the city name
$cityAsArray = explode(' ', $city);

foreach ($cityAsArray as $key => $part) {
    // check if word is in blacklist
    if (in_array($part, $arrayBlacklist)) {
        // remove from the array if it is blacklisted
        unset($cityAsArray[$key]);
    }
}

// convert the city name back to string
$city = implode(' ', $cityAsArray);

更新: 我们可以根据单词数量对黑名单数组进行排序,然后逐个替换每个黑名单字符串。

$arrayBlacklist = ["Kota", "Kab.", "Kota Administrasi", "KAB", "KOTA", "Kabupaten"];
$city = 'Kota Administrasi Jakarta Selatan';
usort($arrayBlacklist, function ($a, $b) {
    return substr_count($a, ' ') < substr_count($b, ' ');
});

foreach ($arrayBlacklist as $blacklist) {
    $city = trim(str_replace($blacklist, '', $city));
}

1
@MuamarHumaidi,您在下面的答案评论中提到了如何解决“Kota Administrasi Jakarta Selatan”问题? - user3532758
是的,仍然不起作用,非常抱歉。如果 $city 包含“Kota Administrasi”,… - Muamar Humaidi
它正在计算每个黑名单字符串中 ' ' 的出现次数(有多少个单词在内)。我的逻辑是根据单词计数对黑名单数组进行排序。 - meewog
单词计数和字长并不相同。 - nice_dev
@vivek_23 我在哪里提到单词的长度了? - meewog
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接