【问题标题】:Filter array of strings and retain elements containing one of many keywords过滤字符串数组并保留包含多个关键字之一的元素
【发布时间】:2016-11-23 22:21:21
【问题描述】:

我目前已完成所有代码以按一个关键字进行过滤,但我想按 100 多个关键字进行过滤。我对PHP的经验不够,所以我尝试过,但失败了。

这是我当前的代码,但我想修改它以使用多个关键字。

function postResolve ($key) {
    return isset($_POST[$key]) ? $_POST[$key] : null;
}

$formData = [
    'keyword' => postResolve('keyword'),
    'text'    => postResolve('text')
];

if (is_null($formData['keyword']) || is_null($formData['text'])) {
    return 'Nothing to do... Missing text or keyword.';
}

$text = explode(PHP_EOL, $formData['text']);

$storage = [];

foreach ($text as $sentence) {
    if (strpos($sentence, $formData['keyword']) !== false) {
        $storage[] = trim($sentence);
    }
}

echo json_encode($storage);

如果有人可以帮助我进行此更改,将不胜感激:)

【问题讨论】:

  • 如果您使用的是 PHP 7,isset($_POST[$key]) ? $_POST[$key] : null 等于 $_POST[$key] ?? null
  • 我不能 100% 确定 PHP 是我迄今为止最讨厌的语言,我有一个朋友为我做这件事。我刚刚修改它以使用引导程序。
  • 您可以使用 in_array 并将 100 多个关键字放在大海捞针中。
  • 您是如何获得多个关键字的?它们在数组中吗?
  • @Dzje 我不确定这是从哪里来的,PHP 被至少 50% 的网络服务器使用,并且被许多流行的网站使用。

标签: php filter keyword


【解决方案1】:

我建议使用stripos() 而不是strpos()。与strpos() 不同,stripos() 不区分大小写。将您的关键字视为一个数组。假设它们是逗号分隔的:

<?php
    function postResolve ($key) {
        return isset($_POST[$key]) ? $_POST[$key] : NULL;
    }

    function checkKeywords($sentence, $keywords) {
        foreach($keywords as $keyword) {
            if(stripos($sentence, $keyword) !== FALSE) { return TRUE; }
        }
        return FALSE;
    }

    if(isset($_POST) && !empty($_POST)) {

        $formData = array(
            'keywords' => postResolve('keywords'),
            'text'    => postResolve('text')
        );

        if(is_null($formData['keywords']) || is_null($formData['text'])) {
            echo 'Nothing to do... Missing text or keyword.';
        }

        $text = explode(PHP_EOL, $formData['text']);
        $keywords = explode(',', $formData['keywords']);

        $storage = array();

        foreach($text as $sentence) {
            if(checkKeywords($sentence, $keywords)) {
                $storage[] = trim($sentence);
            }
        }

        echo json_encode($storage);
        exit();
    }
?>

<form>
    <textarea name="keywords"></textarea>
    <textarea name="text"></textarea>
    <input type="submit" value="Submit">
</form>
<div></div>

<script src="https://code.jquery.com/jquery-2.2.4.min.js"></script>
<script>
    $('form').on('submit', function(event) {
        event.preventDefault();
        $('div').load(location.href, $('form').serializeArray());
    });
</script>

【讨论】:

  • 比如说,我想过滤两个关键字“07883, 07886”,这两个关键字用逗号分隔,这样可以吗?
  • 07883,07886 将起作用,除非您使用“,”作为分隔符进行分解。您总是可以在逗号上爆炸并使用 array_map 来修剪关键字,以防逗号后有空格。或者只是在 PHP_EOL 上爆炸并将关键字放在一个新行上,就像你在做你的文字一样。
  • 是的,没有过滤,它只是导致过滤框返回空白:(
  • @Dzje 将整个脚本粘贴到空白文档中,它会起作用。
  • 这是我的 index.php 的代码 pastebin.com/raw/yWd8ptKc 有没有机会让它与它一起工作?
猜你喜欢
  • 2012-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-18
  • 2020-12-13
相关资源
最近更新 更多