Advertisement
Guest User

Untitled

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