Закрытие строки двойными кавычками

Я пытаюсь обрабатывать текст, который может содержать одинарные кавычки и другой специальный символ. Если он заключен в единую кавычку, он не продолжается. Поэтому я пытаюсь заключить одиночную кавычку в двойную кавычку.

Я уже проверил предыдущие темы.

Вот код:

Результат проверки: http://ideone.com/gWFdUb

<?php function clean($string) { eval('$string = "'.$string.'";'); $string = str_replace(' ', ' ', $string); // Replaces all spaces with hyphens. return preg_replace('/[^A-Za-z0-9 @\-]/', '', $string); // Removes special chars. } $d = clean('this was readlly n'ice 'test for@me to') ; echo $d; 

Что случилось с eval?

Я обрабатываю пользовательские твиты, сообщения для двух целей.

  1. Хранить в таблице mysql. (mysqli_real_escape) не помогли
  2. Обработка каждой строки в тексте для сопоставления и пометки POS (часть речи).

Я застрял из-за таких символов в тексте. Поэтому пытаюсь удалить его, прежде чем начать обработку.

ОБНОВИТЬ:

Проверьте это, здесь я уже использую mysqli_real_escape_String даже скрипт останавливается, когда он достигает этого

 ... mention-179 May Thanks @ShaleMarkets @01Finser @52York @AB_CutRock @AFSPG @AJSmith222 @AlbertaEnergy @andymartin @annemullettamg @APGQ_officiel-440929408564477952-Tue Mar 04 19:18:57 +0000 2014-19:03:572014:03:04201403Adnan Aftab Nizamani0131 mention-180 Thank you for @ShaleMarkets, to promoting, thank you very much for an award. Glad to have been able to help you :)-440897048963850240-Tue Mar 04 17:10:22 +0000 2014-17:03:222014:03:04201403♘-₭ℜi℘-0582 mention-181 @ShaleMarkets https://t.co/aM8liykQqR-440890009273393152-Tue Mar 04 16:42:24 +0000 2014-16:03:242014:03:04201403Bre Burey018 

Что не так в упоминании – 181, чтобы он застрял? Вот код

  foreach ($tweets1 as $item) { $count = $count + 1; $text = $item->text; //echo $userid.$text; $text_id = $item->id; $constant = 'mention'; $time = $item->created_at; //echo $time; //$dt = new DateTime('@' . strtotime($time)); $dt = \DateTime::createFromFormat('DM d H:i:se Y', $time); //var_dump($dt); $tweet_time = $dt->format('H:m:s'); $tweet_dtm = $dt->format('Y:m:d'); $year = $dt->format('Y'); $month = $dt->format('m'); $user_name = $item->user->name; // echo $year.$month.$user_name; $inreplyto = $item->in_reply_to_screen_name; $rt_count = $item->retweet_count; $follower_count = $item->user->followers_count; echo $constant."-".$count."<br>".$text."-".$text_id."-".$time."-".$tweet_time.$tweet_dtm.$year.$month.$user_name.$rt_count.$follower_count."<br>"; echo "<br>"; $con = mysqli_connect('127.0.0.1', 'root', 'root', 'root'); if (mysqli_connect_errno()) { echo "Failed to connect to MySQL: " . mysqli_connect_error(); return; } $text = mysqli_real_escape_string($con,$text); $insertQuery1 = "INSERT INTO twitter_mention(`username`,`userid`,`tweet_text`,`text_id`,`time`,`month`,`year`,`date`,`user_follower_count`,`rt_count`,`constant`,`in_reply_to`) VALUES ('".$twitteruser."','".$userid."','".$text."','".$text_id."','".$tweet_time."','".$month."','".$year."','".$tweet_dtm."','".$follower_count."','".$rt_count."','".$constant."','".$inreplyto."')"; if (!mysqli_query($con,$insertQuery1)) { // die('Error: ' . mysqli_error($con)); // echo "error"; } :  foreach ($tweets1 as $item) { $count = $count + 1; $text = $item->text; //echo $userid.$text; $text_id = $item->id; $constant = 'mention'; $time = $item->created_at; //echo $time; //$dt = new DateTime('@' . strtotime($time)); $dt = \DateTime::createFromFormat('DM d H:i:se Y', $time); //var_dump($dt); $tweet_time = $dt->format('H:m:s'); $tweet_dtm = $dt->format('Y:m:d'); $year = $dt->format('Y'); $month = $dt->format('m'); $user_name = $item->user->name; // echo $year.$month.$user_name; $inreplyto = $item->in_reply_to_screen_name; $rt_count = $item->retweet_count; $follower_count = $item->user->followers_count; echo $constant."-".$count."<br>".$text."-".$text_id."-".$time."-".$tweet_time.$tweet_dtm.$year.$month.$user_name.$rt_count.$follower_count."<br>"; echo "<br>"; $con = mysqli_connect('127.0.0.1', 'root', 'root', 'root'); if (mysqli_connect_errno()) { echo "Failed to connect to MySQL: " . mysqli_connect_error(); return; } $text = mysqli_real_escape_string($con,$text); $insertQuery1 = "INSERT INTO twitter_mention(`username`,`userid`,`tweet_text`,`text_id`,`time`,`month`,`year`,`date`,`user_follower_count`,`rt_count`,`constant`,`in_reply_to`) VALUES ('".$twitteruser."','".$userid."','".$text."','".$text_id."','".$tweet_time."','".$month."','".$year."','".$tweet_dtm."','".$follower_count."','".$rt_count."','".$constant."','".$inreplyto."')"; if (!mysqli_query($con,$insertQuery1)) { // die('Error: ' . mysqli_error($con)); // echo "error"; } в  foreach ($tweets1 as $item) { $count = $count + 1; $text = $item->text; //echo $userid.$text; $text_id = $item->id; $constant = 'mention'; $time = $item->created_at; //echo $time; //$dt = new DateTime('@' . strtotime($time)); $dt = \DateTime::createFromFormat('DM d H:i:se Y', $time); //var_dump($dt); $tweet_time = $dt->format('H:m:s'); $tweet_dtm = $dt->format('Y:m:d'); $year = $dt->format('Y'); $month = $dt->format('m'); $user_name = $item->user->name; // echo $year.$month.$user_name; $inreplyto = $item->in_reply_to_screen_name; $rt_count = $item->retweet_count; $follower_count = $item->user->followers_count; echo $constant."-".$count."<br>".$text."-".$text_id."-".$time."-".$tweet_time.$tweet_dtm.$year.$month.$user_name.$rt_count.$follower_count."<br>"; echo "<br>"; $con = mysqli_connect('127.0.0.1', 'root', 'root', 'root'); if (mysqli_connect_errno()) { echo "Failed to connect to MySQL: " . mysqli_connect_error(); return; } $text = mysqli_real_escape_string($con,$text); $insertQuery1 = "INSERT INTO twitter_mention(`username`,`userid`,`tweet_text`,`text_id`,`time`,`month`,`year`,`date`,`user_follower_count`,`rt_count`,`constant`,`in_reply_to`) VALUES ('".$twitteruser."','".$userid."','".$text."','".$text_id."','".$tweet_time."','".$month."','".$year."','".$tweet_dtm."','".$follower_count."','".$rt_count."','".$constant."','".$inreplyto."')"; if (!mysqli_query($con,$insertQuery1)) { // die('Error: ' . mysqli_error($con)); // echo "error"; } в  foreach ($tweets1 as $item) { $count = $count + 1; $text = $item->text; //echo $userid.$text; $text_id = $item->id; $constant = 'mention'; $time = $item->created_at; //echo $time; //$dt = new DateTime('@' . strtotime($time)); $dt = \DateTime::createFromFormat('DM d H:i:se Y', $time); //var_dump($dt); $tweet_time = $dt->format('H:m:s'); $tweet_dtm = $dt->format('Y:m:d'); $year = $dt->format('Y'); $month = $dt->format('m'); $user_name = $item->user->name; // echo $year.$month.$user_name; $inreplyto = $item->in_reply_to_screen_name; $rt_count = $item->retweet_count; $follower_count = $item->user->followers_count; echo $constant."-".$count."<br>".$text."-".$text_id."-".$time."-".$tweet_time.$tweet_dtm.$year.$month.$user_name.$rt_count.$follower_count."<br>"; echo "<br>"; $con = mysqli_connect('127.0.0.1', 'root', 'root', 'root'); if (mysqli_connect_errno()) { echo "Failed to connect to MySQL: " . mysqli_connect_error(); return; } $text = mysqli_real_escape_string($con,$text); $insertQuery1 = "INSERT INTO twitter_mention(`username`,`userid`,`tweet_text`,`text_id`,`time`,`month`,`year`,`date`,`user_follower_count`,`rt_count`,`constant`,`in_reply_to`) VALUES ('".$twitteruser."','".$userid."','".$text."','".$text_id."','".$tweet_time."','".$month."','".$year."','".$tweet_dtm."','".$follower_count."','".$rt_count."','".$constant."','".$inreplyto."')"; if (!mysqli_query($con,$insertQuery1)) { // die('Error: ' . mysqli_error($con)); // echo "error"; } :  foreach ($tweets1 as $item) { $count = $count + 1; $text = $item->text; //echo $userid.$text; $text_id = $item->id; $constant = 'mention'; $time = $item->created_at; //echo $time; //$dt = new DateTime('@' . strtotime($time)); $dt = \DateTime::createFromFormat('DM d H:i:se Y', $time); //var_dump($dt); $tweet_time = $dt->format('H:m:s'); $tweet_dtm = $dt->format('Y:m:d'); $year = $dt->format('Y'); $month = $dt->format('m'); $user_name = $item->user->name; // echo $year.$month.$user_name; $inreplyto = $item->in_reply_to_screen_name; $rt_count = $item->retweet_count; $follower_count = $item->user->followers_count; echo $constant."-".$count."<br>".$text."-".$text_id."-".$time."-".$tweet_time.$tweet_dtm.$year.$month.$user_name.$rt_count.$follower_count."<br>"; echo "<br>"; $con = mysqli_connect('127.0.0.1', 'root', 'root', 'root'); if (mysqli_connect_errno()) { echo "Failed to connect to MySQL: " . mysqli_connect_error(); return; } $text = mysqli_real_escape_string($con,$text); $insertQuery1 = "INSERT INTO twitter_mention(`username`,`userid`,`tweet_text`,`text_id`,`time`,`month`,`year`,`date`,`user_follower_count`,`rt_count`,`constant`,`in_reply_to`) VALUES ('".$twitteruser."','".$userid."','".$text."','".$text_id."','".$tweet_time."','".$month."','".$year."','".$tweet_dtm."','".$follower_count."','".$rt_count."','".$constant."','".$inreplyto."')"; if (!mysqli_query($con,$insertQuery1)) { // die('Error: ' . mysqli_error($con)); // echo "error"; } 

Всегда используйте контекстное экранирование

Вы не можете в целом «чистить» данные без какого-либо контекста того, для чего это необходимо. Не пытайтесь создать единую функцию для обработки всех возможных случаев. Только не надо. Это бессмысленно. В вашей функции вы пытаетесь « очистить » строку, удалив определенные символы. Вы не можете очистить строку, удалив набор символов. Эта идея ошибочна, потому что вы всегда должны позволять использовать некоторые символы, которые являются особыми в синтаксисе или другом.

Вместо этого обработайте строку в соответствии с контекстом, в котором она будет использоваться. Например:

  • Если вы собираетесь использовать эту строку в SQL-запросе, вы должны использовать подготовленные операторы (или mysqli_real_escape_string() ) для правильного mysqli_real_escape_string() данных.

  • Если вы собираетесь вывести это значение в разметке HTML, вам нужно использовать htmlspecialchars() для htmlspecialchars() данных.

  • Если вы собираетесь использовать его как аргумент командной строки, вам нужно использовать escapeshellcmd() или escapeshellarg() .

Дальнейшее чтение:

  • Security.SE – Каков наилучший способ дезинформировать ввод пользователей в PHP?
  • Каков наилучший метод для дезинфекции пользовательского ввода с помощью PHP?
  • Ликвидация опасных символов исключает SQL-инъекцию?

В этом ответе я попытаюсь ответить на ваш первоначальный вопрос:

Что случилось с eval?

Ничего. Вторая строка – единственная строка, содержащая синтаксическую ошибку. Вы не избегаете однозначных кавычек правильно. Попробуйте следующее:

 $d = clean('this was readlly n\'ice \'test for@me to'); 

Теперь он должен получить этот результат:

 this was readlly nice test for@me to 

Я не уверен, что это ожидаемый результат. Если вы обновите вопрос, чтобы включить то, что именно вы пытаетесь достичь, и почему вам небезразличен тип кавычек, в который была вложена строка , возможно, я могу помочь вам найти решение.

Попробуй это-

 <?php function clean($string) { eval("\$string = \"$string\";"); $string = str_replace(' ', ' ', $string); // Replaces all spaces with hyphens. return preg_replace('/[^a-zA-Z0-9_ %\[\]\.\(\)%&-]/s', '', $string); // Removes special chars. } $d = clean("this was readlly n'ice 'test for@me to") ; echo $d; ?> 

Выходной сигнал – this was readlly nice test forme to