RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 609025
Accepted
iKey
iKey
Asked:2020-12-29 05:29:04 +0000 UTC2020-12-29 05:29:04 +0000 UTC 2020-12-29 05:29:04 +0000 UTC

在文本中查找数据库中的单词

  • 772

你好。数据库中有一张表slovo,它的结构是:

id - auto_increment 
name - само слово( уникальный )

有一个变量:$text,其中包含一些文本。

该表slovo有一个条目: id = 1, name = Apple , id = 2, name = tree

$text = "В корзине лежит яблоко. В поле стоит дерево.";

问题:如何判断变量中是否有表中的词,如果有,则在中slovo选择这些词<span id="id_slovo">слово</span>,其中id_slovo是这个词从数据库中的id值。

PS鉴于可能有短语。

如果有任何有用的信息,我将不胜感激。

php
  • 7 7 个回答
  • 10 Views

7 个回答

  • Voted
  1. Best Answer
    Denis Matafonov
    2020-12-29T05:41:08Z2020-12-29T05:41:08Z
    //Сначала нужно найти все слова, бьем фразу в массив по пробелам
    
    $words = explode(' ', $text);
    
    //Затем проверяем каждое слово:
    
    foreach($words as $word) {
    
        $word = trim($word); //убираем пробелы
    
        //Проверяем в базе, любимым адаптером выполняя запрос
        //Само собой никто не мешает заменить ILIKE на LIKE или =
        $wordId = $msSql->fetchOne("SELECT id FROM slove WHERE name ILIKE '{$word}'");
    
    
        //Если в базе такое слово есть, то заменяем его в тексте на нужный span
       if (!empty($wordId)) {
          $text = str_replace($word, "<span id='$wordId'>$word</span>", $text);
       }
    
    }
    
    • 6
  2. P. Fateev
    2020-01-01T17:07:43Z2020-01-01T17:07:43Z
    $text = "В корзине лежит яблоко. В поле стоит дерево.";
    
    // все слова из таблицы, присутствующие в тексте получаем одним запросом
    $result = mysql_query("SELECT id, name FROM slovo
    WHERE INSTR('" . mysql_escape_string($text) . "', name)");
    
    // проходим по всем словам и делаем замену
    while ($row = mysql_fetch_array($result, MYSQL_ASSOC)) {
        $text = str_ireplace($row['name'], 
            '<span id="word-' . $row['id'] . '">' . $row['name'] . '</span>', 
            $text); 
    }
    
    • 4
  3. Yevgenii Shashkov
    2020-12-31T09:51:15Z2020-12-31T09:51:15Z

    PHP MySQL PDO

    我认为这是正确的解决方案

        class ConnectPDO {
    
            private $connect = array(
                'login' => 'DB_USER',
                'password' => 'DB_PASS',
                'db' => 'slovo_db'
            );
    
            private $dbc;
    
            public function __construct() {
                $db_name=$this->connect['db'];
                $this->dbc = new PDO("mysql:host=localhost;dbname=$db_name;charset=utf8", $this->connect['login'], $this->connect['password']);
            }
    
        }
    
    $connection=new ConnectPDO();
    
    $sth = $connection->dbc->prepare("SELECT * FROM `slovo` WHERE `name` LIKE %:name% ");
    
    
    
    $data = array();
    
    
        $text = "asd  sad asd as dasd asd asdasdas das das das";
    
        //explode делает массив из фразы с которым далее очень просто работать
        $text_aray = explode(" ", $text);
    
        foreach ($text_aray as $each) { 
    
            $sth->execute(array('name'=>$each));
    
            $result = $sth->fetchAll();
    
            $data[] = $result;
        }
    
        // отобразить все слова из базы
        foreach ($data as $data_block){
            foreach ($data_block as $each_row){
                echo '<span id="'.$each_row['id'].'">'.$each_row['name'].'</span><br>';
            }
        }
    

    要替换为您自己的参数:

    DB_USER юзер mysql 
    DB_PASS пароль mysql
    slovo_db база mysql
    
    • 3
  4. Alex
    2020-01-02T00:24:50Z2020-01-02T00:24:50Z
    $text = "В корзине лежит яблоко. В поле стоит дерево.";
    //заменяем несколько пустых символов на один (чтобы избежать ситуации, когда из-за нескольких пробелов сочетания не будут найдены)
    $text = preg_replace('/\s{2,}/', ' ', $text);
    
    //подключаемся к базе данных (на примере MYSQL, подправите под свою базу) и выбираем
    // все слова из таблицы, присутствующие в тексте получаем одним запросом, сортируем по уменьшению длины слов (фраз).
    // Это нужно, чтобы исключить вариант когда при наличии 2-х слов/фраз "яблоко", "лежит яблоко" после замены первого,
    // второе не получится уже заменить, так как между ними уже будет span
    try{
    $link = new PDO(   'mysql:host=your-hostname;dbname=your-db;charset=utf8mb4',
                        'your-username',
                        'your-password',
                        array(
                            PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
                            PDO::ATTR_PERSISTENT => false
                        )
                    );
    
    $handle = $link->prepare('SELECT id, name FROM slovo WHERE INSTR(?, name) ORDER BY CHAR_LENGTH(name) DESC');
    $handle->bindValue(1, $text, PDO::PARAM_STR);
    $handle->execute();
    $result = $handle->fetchAll(PDO::FETCH_OBJ);
    
    // проходим по всем словам и делаем замену
    foreach($result as $row){
    
      //экранируем служебные символы " . \ + * ? [ ^ ] $ ( ) { } = ! < > | : - "
      $word = preg_quote($row->name);
    
      //используем регулярное выражение чтобы:
      //1) после замены регистр слов не был изменён
      //2) были заменены полностью слова а не только вхождения, например при слове "дерево", слово "деревообработка" останутся не тронутыми
    
      $text = preg_replace('/(^|\W)(' . $word . ')($|\W)/iu',  '\\1<span id="word-' . $row->id . '">\\2</span>\\3', $text);
    }
    }
    catch(PDOException $ex){
        print($ex->getMessage());
    }
    

    如果你想使用形态学(比如 phpMorphy 库),那么我建议:

    1)如果slovo表的记录数不大,做full fetch

    $handle = $link->prepare('SELECT id, name FROM slovo ORDER BY CHAR_LENGTH(name) DESC'); $句柄->执行();

    2)如果slovo表的记录数较多,那么为了减少替换时间,在slovo表中增加一列放置词根(可以自动通过库)过滤INSTR(? , new_column) 就可以了。

    3) After 当遍历单词 before 时

    $word = preg_quote($row->name); 
    

    加载单词的所有变体,然后为每个变体执行 preg_replace。

    该解决方案并未正式化为一个类,因为据我所知,这将是您任务的一部分。这里我们只关注要点。

    • 3
  5. Равшан Абдулаев
    2020-01-03T03:54:01Z2020-01-03T03:54:01Z

    例子

     <?php
      # there is no information about where this text is from... we have it in
      # varriable $text
      $text = "В корзине лежит яблоко. В поле стоит дерево.";
    
      #one row result from mysqli_fetch_assoc
      $replacement_arr = array("id"=>1, "name"=>"яблоко"); 
    
      echo 'before:'.$text."\n\t";
      f_process_text($text, $replacement_arr);
      echo 'after:'.$text."\n";
    
    
      function f_process_text(&$text, $replacement_arr){
         #set morphological phrases for $replacement_arr["name"];
         $phrases = f_get_phrases($replacement_arr["name"]); 
         list($patterns, $replacements) = f_get_prepared_fo_replacement_arrs($phrases, $replacement_arr["id"]);
         $text = preg_replace( $patterns, $replacements, $text);
      }
    
      #return array
      function f_get_phrases($words){
        $result = array();
        $result[] = $words;
    
        #to add phrases it is recomended to use [phpMorphy](http://phpmorphy.sourceforge.net/)
    
        return $result;
      }
    
      function f_get_prepared_fo_replacement_arrs($phrases, $id){
          $patterns = array();
          $replacements = array();
          foreach($phrases as $phrase){
              $patterns[] = '/'.$phrase.'/';
              $replacements[] = '<span id="'.$id.'">'.$phrase.'</span>';
          }
          return array($patterns, $replacements);
      }
    ?>
    
    • 0
  6. Rochfort
    2020-01-05T20:12:22Z2020-01-05T20:12:22Z

    这是我得到的收银员:

    <?php
    
    /**
     * Поиск и замена фраз в строке
     * User: Rochfort
     */
    class PhrasesReplacement
    {
        /**
         * Текст
         * @var string
         */
        protected $text;
        /**
         * Массив фраз для замены
         * @var array
         */
        protected $phrases;
        /**
         * Массив подстрок для замены
         * @var array
         */
        protected $patterns = [];
        /**
         * Массив подстрок на замену
         * @var array
         */
        protected $replacements = [];
    
        /**
         * PhrasesReplacement constructor.
         * @param string $text
         * @param array $phrases
         */
        public function __construct(string $text = '', array $phrases = [])
        {
            if (!empty($text)) {
                $this->text = $text;
            }
            if (!empty($phrases)) {
                $this->phrases = $phrases;
            }
        }
    
        /**
         * Получить текст с заменами
         * @return string
         */
        public function getReplacedText()
        {
            if (empty($this->patterns) || empty($this->replacements)) {
                list($this->patterns, $this->replacements) = $this->getPatterns();
            }
            return preg_replace( $this->patterns, $this->replacements, $this->text);
        }
    
        /**
         * Формируем массивы для поиска и замены
         * @return array
         */
        protected function getPatterns() {
            $patterns = [];
            $replacements = [];
    
            foreach ($this->phrases as $phrase) {
                $name = preg_quote($phrase['name']);
                $patterns[] = '/('.$name.')/iu';
                $replacements[] = '<span id="'.$phrase['id'].'">$1</span>';
            }
    
            return [$patterns, $replacements];
        }
    
        /**
         * @return string
         */
        public function getText()
        {
            return $this->text;
        }
    
        /**
         * @param string $text
         * @return PhrasesReplacement
         */
        public function setText(string $text)
        {
            $this->text = $text;
            return $this;
        }
    
        /**
         * @return array
         */
        public function getPhrases()
        {
            return $this->phrases;
        }
    
        /**
         * @param array $phrases
         * @return PhrasesReplacement
         */
        public function setPhrases(array $phrases)
        {
            $this->patterns = [];
            $this->replacements = [];
            $this->phrases = $phrases;
            return $this;
        }
    }
    

    像这样使用它:

    $text = "В корзине лежит яблоко. В поле стоит дерево.";
    $phrases = [
        ['id' => 1, 'name' => 'корзине лежит'],
        ['id' => 2, 'name' => 'дерево'],
    ];
    
    $replacer = new PhrasesReplacement($text,$phrases);
    echo $replacer->getReplacedText() . "\n";
    
    $text2 = "В корзине ЛеЖаТ Яблоки. В поле стоит дерево.";
    echo $replacer->setText($text2)->getReplacedText() . "\n";
    
    $phrases = [
        ['id' => 1, 'name' => 'лежат яблоки']
    ];
    echo $replacer->setPhrases($phrases)->getReplacedText() . "\n";
    

    嗯,相应地,像这样从数据库中获取值将是最方便的:

    $dsn = 'mysql:dbname=dbname;host=127.0.0.1;port=3306';
    $user = 'root';
    $pass = 'root';
    $pdo = new PDO($dsn, $user, $pass);
    
    $sql = 'SELECT `id`, `name` FROM `slovo`;';
    $stmt = $pdo->prepare($sql);
    $stmt->setFetchMode(PDO::FETCH_ASSOC);
    $stmt->execute();
    
    $phrases = $stmt->fetchAll();
    
    • 0
  7. ksv
    2020-01-02T16:23:39Z2020-01-02T16:23:39Z

    一种选择:

    $dsn = 'mysql:host=localhost;dbname=...';
    $user = '...';
    $password = '...';
    
    $text = "В корзине лежит яблоко. В поле стоит дерево."; // исходная строка
    $max_count_of_replace = count(explode(' ', $text)); // максимальное кол-во замен в исходной строке
    
    $opt = [
        PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
        PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC
    ];
    
    try {
        $pdo = new PDO($dsn, $user, $password, $opt);
    } catch (PDOException $e) {
        die('Ошибка: ' . $e->getMessage());
    }
    
    $sql = 'SELECT `id`, `name` FROM `slovo` WHERE INSTR(:text, `name`)';
    $stmt = $pdo->prepare($sql);
    $stmt->bindValue(':text', $text, PDO::PARAM_STR);
    $stmt->execute();
    
    // заменяем слова из таблицы, присутствующие в $text
    
    $count_of_replace = 0;
    foreach ($stmt as $row) {
        $text = str_ireplace($row['name'], "<span id=\"{$row['id']}\">{$row['name']}</span>", $text, $count);
    
        $count_of_replace += $count;
        if ($count_of_replace > $max_count_of_replace) {
            break;
        }
    }
    
    echo $text; // результат
    

    这个想法是使用 MySQL 函数:INSTR()+ 添加了对最大替换次数的限制。

    第二个选项:

    INSTR()例如,如果您希望独立于 DBMS,我们不使用。

    <?php
    
    // параметры подключения
    // ...
    
    $text = "В корзине лежит яблоко. В поле стоит дерево."; // исходная строка
    $max_count_of_replace = count(explode(' ', $text)); // максимальное кол-во замен в исходной строке
    
    $opt = [
        PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
        PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC
    ];
    
    try {
        $pdo = new PDO($dsn, $user, $password, $opt);
    } catch (PDOException $e) {
        die('Ошибка: ' . $e->getMessage());
    }
    
    $sql = 'SELECT `id`, `name` FROM `slovo`;';
    $stmt = $pdo->prepare($sql);
    $stmt->execute();
    
    $count_of_replace = 0;
    foreach ($stmt as $row) {
        $text = str_ireplace($row['name'], "<span id=\"{$row['id']}\">{$row['name']}</span>", $text, $count);
    
        $count_of_replace += $count;
        if ($count_of_replace > $max_count_of_replace) {
            break;
        }
    }
    
    echo $text; // результат
    
    • -1

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    如何停止编写糟糕的代码?

    • 3 个回答
  • Marko Smith

    onCreateView 方法重构

    • 1 个回答
  • Marko Smith

    通用还是非通用

    • 2 个回答
  • Marko Smith

    如何访问 jQuery 中的列

    • 1 个回答
  • Marko Smith

    *.tga 文件的组重命名(3620 个)

    • 1 个回答
  • Marko Smith

    内存分配列表C#

    • 1 个回答
  • Marko Smith

    常规赛适度贪婪

    • 1 个回答
  • Marko Smith

    如何制作自己的自动完成/自动更正?

    • 1 个回答
  • Marko Smith

    选择斐波那契数列

    • 2 个回答
  • Marko Smith

    所有 API 版本中的通用权限代码

    • 2 个回答
  • Martin Hope
    jfs *(星号)和 ** 双星号在 Python 中是什么意思? 2020-11-23 05:07:40 +0000 UTC
  • Martin Hope
    hwak 哪个孩子调用了父母的静态方法?还是不可能完成的任务? 2020-11-18 16:30:55 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    user207618 Codegolf——组合选择算法的实现 2020-10-23 18:46:29 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    Arch ArrayList 与 LinkedList 的区别? 2020-09-20 02:42:49 +0000 UTC
  • Martin Hope
    iluxa1810 哪个更正确使用:if () 或 try-catch? 2020-08-23 18:56:13 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5