Guest User

Untitled

a guest
Jan 6th, 2017
77
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 10.84 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. }
  57.  
  58. $connection=new ConnectPDO();
  59.  
  60. $sth = $connection->dbc->prepare("SELECT * FROM `slovo` WHERE `name` LIKE %:name% ");
  61.  
  62.  
  63.  
  64. $data = array();
  65.  
  66.  
  67. $text = "asd sad asd as dasd asd asdasdas das das das";
  68.  
  69. //explode делает массив из фразы с которым далее очень просто работать
  70. $text_aray = explode(" ", $text);
  71.  
  72. foreach ($text_aray as $each) {
  73.  
  74. $sth->execute(array('name'=>$each));
  75.  
  76. $result = $sth->fetchAll();
  77.  
  78. $data[] = $result;
  79. }
  80.  
  81. // отобразить все слова из базы
  82. foreach ($data as $data_block){
  83. foreach ($data_block as $each_row){
  84. echo '<span id="'.$each_row['id'].'">'.$each_row['name'].'</span><br>';
  85. }
  86. }
  87.  
  88. DB_USER юзер mysql
  89. DB_PASS пароль mysql
  90. slovo_db база mysql
  91.  
  92. <?php
  93. # there is no information about where this text is from... we have it in
  94. # varriable $text
  95. $text = "В корзине лежит яблоко. В поле стоит дерево.";
  96.  
  97. #one row result from mysqli_fetch_assoc
  98. $replacement_arr = array("id"=>1, "name"=>"яблоко");
  99.  
  100. echo 'before:'.$text."nt";
  101. f_process_text($text, $replacement_arr);
  102. echo 'after:'.$text."n";
  103.  
  104.  
  105. function f_process_text(&$text, $replacement_arr){
  106. #set morphological phrases for $replacement_arr["name"];
  107. $phrases = f_get_phrases($replacement_arr["name"]);
  108. list($patterns, $replacements) = f_get_prepared_fo_replacement_arrs($phrases, $replacement_arr["id"]);
  109. $text = preg_replace( $patterns, $replacements, $text);
  110. }
  111.  
  112. #return array
  113. function f_get_phrases($words){
  114. $result = array();
  115. $result[] = $words;
  116.  
  117. #to add phrases it is recomended to use [phpMorphy](http://phpmorphy.sourceforge.net/)
  118.  
  119. return $result;
  120. }
  121.  
  122. function f_get_prepared_fo_replacement_arrs($phrases, $id){
  123. $patterns = array();
  124. $replacements = array();
  125. foreach($phrases as $phrase){
  126. $patterns[] = '/'.$phrase.'/';
  127. $replacements[] = '<span id="'.$id.'">'.$phrase.'</span>';
  128. }
  129. return array($patterns, $replacements);
  130. }
  131. ?>
  132.  
  133. <?php
  134.  
  135. /**
  136. * Поиск и замена фраз в строке
  137. * User: Rochfort
  138. */
  139. class PhrasesReplacement
  140. {
  141. /**
  142. * Текст
  143. * @var string
  144. */
  145. protected $text;
  146. /**
  147. * Массив фраз для замены
  148. * @var array
  149. */
  150. protected $phrases;
  151. /**
  152. * Массив подстрок для замены
  153. * @var array
  154. */
  155. protected $patterns = [];
  156. /**
  157. * Массив подстрок на замену
  158. * @var array
  159. */
  160. protected $replacements = [];
  161.  
  162. /**
  163. * PhrasesReplacement constructor.
  164. * @param string $text
  165. * @param array $phrases
  166. */
  167. public function __construct(string $text = '', array $phrases = [])
  168. {
  169. if (!empty($text)) {
  170. $this->text = $text;
  171. }
  172. if (!empty($phrases)) {
  173. $this->phrases = $phrases;
  174. }
  175. }
  176.  
  177. /**
  178. * Получить текст с заменами
  179. * @return string
  180. */
  181. public function getReplacedText()
  182. {
  183. if (empty($this->patterns) || empty($this->replacements)) {
  184. list($this->patterns, $this->replacements) = $this->getPatterns();
  185. }
  186. return preg_replace( $this->patterns, $this->replacements, $this->text);
  187. }
  188.  
  189. /**
  190. * Формируем массивы для поиска и замены
  191. * @return array
  192. */
  193. protected function getPatterns() {
  194. $patterns = [];
  195. $replacements = [];
  196.  
  197. foreach ($this->phrases as $phrase) {
  198. $name = preg_quote($phrase['name']);
  199. $patterns[] = '/('.$name.')/iu';
  200. $replacements[] = '<span id="'.$phrase['id'].'">$1</span>';
  201. }
  202.  
  203. return [$patterns, $replacements];
  204. }
  205.  
  206. /**
  207. * @return string
  208. */
  209. public function getText()
  210. {
  211. return $this->text;
  212. }
  213.  
  214. /**
  215. * @param string $text
  216. * @return PhrasesReplacement
  217. */
  218. public function setText(string $text)
  219. {
  220. $this->text = $text;
  221. return $this;
  222. }
  223.  
  224. /**
  225. * @return array
  226. */
  227. public function getPhrases()
  228. {
  229. return $this->phrases;
  230. }
  231.  
  232. /**
  233. * @param array $phrases
  234. * @return PhrasesReplacement
  235. */
  236. public function setPhrases(array $phrases)
  237. {
  238. $this->patterns = [];
  239. $this->replacements = [];
  240. $this->phrases = $phrases;
  241. return $this;
  242. }
  243. }
  244.  
  245. $text = "В корзине лежит яблоко. В поле стоит дерево.";
  246. $phrases = [
  247. ['id' => 1, 'name' => 'корзине лежит'],
  248. ['id' => 2, 'name' => 'дерево'],
  249. ];
  250.  
  251. $replacer = new PhrasesReplacement($text,$phrases);
  252. echo $replacer->getReplacedText() . "n";
  253.  
  254. $text2 = "В корзине ЛеЖаТ Яблоки. В поле стоит дерево.";
  255. echo $replacer->setText($text2)->getReplacedText() . "n";
  256.  
  257. $phrases = [
  258. ['id' => 1, 'name' => 'лежат яблоки']
  259. ];
  260. echo $replacer->setPhrases($phrases)->getReplacedText() . "n";
  261.  
  262. $dsn = 'mysql:dbname=dbname;host=127.0.0.1;port=3306';
  263. $user = 'root';
  264. $pass = 'root';
  265. $pdo = new PDO($dsn, $user, $pass);
  266.  
  267. $sql = 'SELECT `id`, `name` FROM `slovo`;';
  268. $stmt = $pdo->prepare($sql);
  269. $stmt->setFetchMode(PDO::FETCH_ASSOC);
  270. $stmt->execute();
  271.  
  272. $phrases = $stmt->fetchAll();
  273.  
  274. $text = "В корзине лежит яблоко. В поле стоит дерево.";
  275. //заменяем несколько пустых символов на один (чтобы избежать ситуации, когда из-за нескольких пробелов сочетания не будут найдены)
  276. $text = preg_replace('/s{2,}/', ' ', $text);
  277.  
  278. //подключаемся к базе данных (на примере MYSQL, подправите под свою базу) и выбираем
  279. // все слова из таблицы, присутствующие в тексте получаем одним запросом, сортируем по уменьшению длины слов (фраз).
  280. // Это нужно, чтобы исключить вариант когда при наличии 2-х слов/фраз "яблоко", "лежит яблоко" после замены первого,
  281. // второе не получится уже заменить, так как между ними уже будет span
  282. try{
  283. $link = new PDO( 'mysql:host=your-hostname;dbname=your-db;charset=utf8mb4',
  284. 'your-username',
  285. 'your-password',
  286. array(
  287. PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
  288. PDO::ATTR_PERSISTENT => false
  289. )
  290. );
  291.  
  292. $handle = $link->prepare('SELECT id, name FROM slovo WHERE INSTR(?, name) ORDER BY CHAR_LENGTH(name) DESC');
  293. $handle->bindValue(1, $text, PDO::PARAM_STR);
  294. $handle->execute();
  295. $result = $handle->fetchAll(PDO::FETCH_OBJ);
  296.  
  297. // проходим по всем словам и делаем замену
  298. foreach($result as $row){
  299.  
  300. //экранируем служебные символы " . + * ? [ ^ ] $ ( ) { } = ! < > | : - "
  301. $word = preg_quote($row->name);
  302.  
  303. //используем регулярное выражение чтобы:
  304. //1) после замены регистр слов не был изменён
  305. //2) были заменены полностью слова а не только вхождения, например при слове "дерево", слово "деревообработка" останутся не тронутыми
  306.  
  307. $text = preg_replace('/(^|W)(' . $word . ')($|W)/iu', '\1<span id="word-' . $row->id . '">\2</span>\3', $text);
  308. }
  309. }
  310. catch(PDOException $ex){
  311. print($ex->getMessage());
  312. }
  313.  
  314. INSTR(?, new_column).
  315.  
  316. $dsn = 'mysql:host=localhost;dbname=...';
  317. $user = '...';
  318. $password = '...';
  319.  
  320. $text = "В корзине лежит яблоко. В поле стоит дерево."; // исходная строка
  321. $max_count_of_replace = count(explode(' ', $text)); // максимальное кол-во замен в исходной строке
  322.  
  323. $opt = [
  324. PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
  325. PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC
  326. ];
  327.  
  328. try {
  329. $pdo = new PDO($dsn, $user, $password, $opt);
  330. } catch (PDOException $e) {
  331. die('Ошибка: ' . $e->getMessage());
  332. }
  333.  
  334. $sql = 'SELECT `id`, `name` FROM `slovo` WHERE INSTR(:text, `name`)';
  335. $stmt = $pdo->prepare($sql);
  336. $stmt->bindValue(':text', $text, PDO::PARAM_STR);
  337. $stmt->execute();
  338.  
  339. // заменяем слова из таблицы, присутствующие в $text
  340.  
  341. $count_of_replace = 0;
  342. foreach ($stmt as $row) {
  343. $text = str_ireplace($row['name'], "<span id="{$row['id']}">{$row['name']}</span>", $text, $count);
  344.  
  345. $count_of_replace += $count;
  346. if ($count_of_replace > $max_count_of_replace) {
  347. break;
  348. }
  349. }
  350.  
  351. echo $text; // результат
Add Comment
Please, Sign In to add comment