Изменить формат вывода случайной строки

Поиск  Пользователи  Правила 
Закрыть
Логин:
Пароль:
Забыли свой пароль?
Регистрация
Войти
 
Страницы: 1
Ответить
Изменить формат вывода случайной строки
Здравствуйте Други!
Прошу помочь в решении проблемы.
Знания поверхностные и поэтому использовал всю свою скудную "библиотеку" так и не смог найти решение.
Имеется функция вывода случайной строки из файла:
Код
function RandLine($num,$s,$fileName){
      $data = file($fileName); 
      $arr = array();
      $output = "";
      

      for ( $i = 0; $i < $num; $i++ ) {
         
         do {
            $rand = mt_rand(0, count($data) - 1);
         } while ( in_array($rand, $arr) );
         
         $arr[] = $rand;
         $output .= str_replace("\n", "", $data[$rand]).$s;
      }
      return $output;
}
****************Изменить этот кусок кода********************
function GenTheText( $t ) {
   while ( preg_match( '#\{([^\{\}]+)\}#i', $t, $m ) ) {
      $v = explode( '|', $m[1] );
      $i = rand( 0, count( $v ) - 1 );
      $t = preg_replace( '#'.preg_quote($m[0]).'#i', $v[$i], $t, 1 );
   } return $t;
}
$str='';
***********************************************************
function mb_ucfirst($str) { 
     return mb_substr(mb_strtoupper($str,'utf-8'),0,1,
'utf-8').mb_strtolower(mb_substr($str,1,mb_strlen($str,'utf-8'),'utf-8'),'utf-8');
} 


$public = RandLine($num = 1,$s = "", $dir."public.txt");
$attach = "img/".$public.".txt";
$rand36 = rand(1,1); 
$attachments = RandLine($num = $rand36,$s = ", ", $attach);
$randtext = file_get_contents($dir."text/".$public.".txt");

$text = GenTheText($randtext);

echo $public."<br/>".$attach."<br/>".$attachments."<br/>".$text;
$ch = curl_init('https://api.vk.com/method/wall.post');
curl_setopt ($ch, CURLOPT_HEADER, 1); 
curl_setopt ($ch, CURLOPT_USERAGENT, 
'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.0.3) Gecko/2008092417 Firefox/3.0.3');
curl_setopt ($ch, CURLOPT_REFERER, 'https://api.vk.com/method/wall.post');
curl_setopt ($ch, CURLOPT_POST, 1);
curl_setopt ($ch, CURLOPT_COOKIEJAR, $dir.'cookie.txt');
curl_setopt ($ch, CURLOPT_POSTFIELDS, 
'owner_id=-'.$public.'&v=5.28&access_token='.$access_token.'&attachments='.$attachments.'&message='.$text);
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt ($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt ($ch, CURLOPT_HTTPHEADER, array('Expect:'));
curl_exec ($ch);
$result = curl_multi_getcontent ($ch);
echo "\n".'Login OK'."\n".'[result ===8<===>'."\n".$result."\n".'<===>8=== result]'."<br/>\n";
echo "http://vk.com/public".$public."";
curl_close ($ch);

?>

Но эта функция имеет недостаток по ограничению количества символов в 30 тыс.
Пример:
{привет|здравствуй|как дела|.....}-30 тыс.
При добавлении вариантов слов или словосочетаний приходит ответ:
Compilation failed: regular expression is too large at offset 291712 in

C:\OpenServer\OSPanel\domains\ut316\send.php on line 31
Если возможность уйти от формата {|} и перейти на формат:
текст1
текст2
текст3
.....
Необходимо брать случайную текстовую строку из файла объемом хотя бы 1 мб
Текствый файл находиться в папке text
Depending on the application, valid solutions are:
• Shorten the Regular Expression by using DEFINE for any redundant sub-expressions (see below).
• Increase the max limit on regex size by re-compiling PHP (see drew010's great answer). Although this may not be available in all environments or may create compatibility issues if changing servers.
• Split your regular expression at | and process the resulting sub-expressions separately. If the regex is essentially numerous keywords separated by |, then converting to a strtok or a loop with strpos may be a better & faster choice.
• Use other language / regex engine such as C++/Boost, although I did not verify this.

Solution to my specific problem: As per Mario's comment, using the (?(DEFINE)...) construct for some of the sub-expressions that were re-used several times reduced my regex size from 41,127 characters down to "only" 4,071, and this was an elegant solution to get rid of the error “Regular Expression is too large.”
http://www.rexegg.com/regex-disambiguation.html#define
Услуги Системного Администратора - Работаю только с Юр. Лицами по договору обслуживания.
Страницы: 1
Ответить
Форма ответов
Текст сообщения*
:) ;) :D 8) :( :| :cry: :evil: :o :oops: :{} :?: :!: :idea:
Защита от автоматических сообщений. Введите символы, изображенные на этой картинке в поле ввода &quote;Код подтверждения&quote;.