Advertisement
Guest User

Untitled

a guest
Jan 2nd, 2017
102
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.01 KB | None | 0 0
  1. id - auto_increment
  2. name - само слово( уникальный )
  3.  
  4. $text = "В корзине лежит яблоко. В поле стоит дерево.";
  5.  
  6. //Сначала нужно найти все слова, бьем фразу в массив по пробелам
  7.  
  8. $words = explode(' ', $text);
  9.  
  10. //Затем проверяем каждое слово:
  11.  
  12. foreach($words as $word) {
  13.  
  14. $word = trim($word); //убираем пробелы
  15.  
  16. //Проверяем в базе, любимым адаптером выполняя запрос
  17. //Само собой никто не мешает заменить ILIKE на LIKE или =
  18. $wordId = $msSql->fetchOne("SELECT id FROM slove WHERE name ILIKE '{$word}'");
  19.  
  20.  
  21. //Если в базе такое слово есть, то заменяем его в тексте на нужный span
  22. if (!empty($wordId)) {
  23. $text = str_replace($word, "<span id='$wordId'>$word</span>", $text);
  24. }
  25.  
  26. }
  27.  
  28. $text = "В корзине лежит яблоко. В поле стоит дерево.";
  29.  
  30. // все слова из таблицы, присутствующие в тексте получаем одним запросом
  31. $result = mysql_query("SELECT id, name FROM slovo
  32. WHERE INSTR('" . mysql_escape_string($text) . "', name)");
  33.  
  34. // проходим по всем словам и делаем замену
  35. while ($row = mysql_fetch_array($result, MYSQL_ASSOC)) {
  36. $text = str_ireplace($row['name'],
  37. '<span id="word-' . $row['id'] . '">' . $row['name'] . '</span>',
  38. $text);
  39. }
  40.  
  41. class ConnectPDO {
  42.  
  43. private $connect = array(
  44. 'login' => 'DB_USER',
  45. 'password' => 'DB_PASS',
  46. 'db' => 'slovo_db'
  47. );
  48.  
  49. private $dbc;
  50.  
  51. public function __construct() {
  52. $db_name=$this->connect['db'];
  53. $this->dbc = new PDO("mysql:host=localhost;dbname=$db_name;charset=utf8", $this->connect['login'], $this->connect['password']);
  54. }
  55.  
  56. public function get_data($sql,$parameters=array()) {
  57.  
  58. if (!empty($parameters)) {
  59. $sth = $this->dbc->prepare($sql);
  60. $sth->execute($parameters);
  61. } else {
  62. $sth = $this->dbc->prepare($sql);
  63. $sth->execute();
  64. }
  65.  
  66. $result = $sth->fetchAll();
  67.  
  68. return $result;
  69. }
  70.  
  71. }
  72.  
  73. $connection=new ConnectPDO();
  74.  
  75. $data = array();
  76.  
  77.  
  78. $text = "asd sad asd as dasd asd asdasdas das das das";
  79.  
  80. //explode делает массив из фразы с которым далее очень просто работать
  81. $text_aray = explode(" ", $text);
  82.  
  83. foreach ($text_aray as $each) {
  84. $data[] = $connection->get_data("SELECT * FROM `slovo` WHERE `name` LIKE %:name% ",array('name'=>$each));
  85. }
  86.  
  87. // отобразить все слова из базы
  88. foreach ($data as $data_block){
  89. foreach ($data_block as $each_row){
  90. echo '<span id="'.$each_row['id'].'">'.$each_row['name'].'</span><br>';
  91. }
  92. }
  93.  
  94. DB_USER юзер mysql
  95. DB_PASS пароль mysql
  96. slovo_db база mysql
  97.  
  98. $text = "В корзине лежит яблоко. В поле стоит дерево.";
  99. //заменяем несколько пустых символов на один (чтобы избежать ситуации, когда из-за нескольких пробелов сочетания не будут найдены)
  100. $text = preg_replace('/s{2,}/', ' ', $text);
  101.  
  102. // все слова из таблицы, присутствующие в тексте получаем одним запросом, сортируем по уменьшению длины слов (фраз).
  103. // Это нужно, чтобы исключить вариант когда при наличии 2-х слов/фраз "яблоко", "лежит яблоко" после замены первого,
  104. // второе не получится уже заменить, так как между ними уже будет span
  105.  
  106. $result = mysql_query("SELECT id, name FROM slovo
  107. WHERE INSTR('" . mysql_escape_string($text) . "', name) ORDER BY CHAR_LENGTH(name) DESC") ;
  108.  
  109. // проходим по всем словам и делаем замену
  110. while ($row = mysql_fetch_array($result, MYSQL_ASSOC)) {
  111.  
  112. //экранируем служебные символы
  113. $word = preg_quote($row['name']);
  114.  
  115. $text = preg_replace('/(^|W)(' . $word . ')($|W)/iu', '\1<span id="word-' . $row['id'] . '">\2</span>\3', $text);
  116. //используем регулярное выражение чтобы:
  117. //1) после замены регистр слов не был изменён
  118. //2) были заменены полностью слова а не только вхождения, например при слове "дерево", слово "деревообработка" останутся не тронутыми
  119. }
  120.  
  121. $dsn = 'mysql:host=localhost;dbname=...';
  122. $user = '...';
  123. $password = '...';
  124.  
  125. $text = "В корзине лежит яблоко. В поле стоит дерево."; // исходная строка
  126. $max_count_of_replace = count(explode(' ', $text)); // максимальное кол-во замен в исходной строке
  127.  
  128. $opt = [
  129. PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
  130. PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC
  131. ];
  132.  
  133. try {
  134. $pdo = new PDO($dsn, $user, $password, $opt);
  135. } catch (PDOException $e) {
  136. die('Ошибка: ' . $e->getMessage());
  137. }
  138.  
  139. $sql = 'SELECT `id`, `name` FROM `slovo` WHERE INSTR(:text, `name`)';
  140. $stmt = $pdo->prepare($sql);
  141. $stmt->bindValue(':text', $text, PDO::PARAM_STR);
  142. $stmt->execute();
  143.  
  144. // заменяем слова из таблицы, присутствующие в $text
  145.  
  146. $count_of_replace = 0;
  147. foreach ($stmt as $row) {
  148. $text = str_ireplace($row['name'], "<span id="{$row['id']}">{$row['name']}</span>", $text, $count);
  149.  
  150. $count_of_replace += $count;
  151. if ($count_of_replace > $max_count_of_replace) {
  152. break;
  153. }
  154. }
  155.  
  156. echo $text; // результат
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement