Вам лучше выбирать случайную строку через ваш бэкэнд-сервер, а не через js, потому что серверы должны были это делать. Вы можете создать страницу, к которой вы будете обращаться, передать путь к вашему файлу в качестве параметра и настроить его на возврат случайной строки из этого файла. После того, как вы проанализировали эту строку, вы можете использовать split()
в вашей проанализированной строке, чтобы получить массив этих слов. Также вы должны рассмотреть возможность использования fetch
, потому что это замена для XHR
.
Итак, мой код js
выглядит примерно так:
function getTextFile(path){
var line = Math.floor(Math.random() * 4);
params = {
path: path,
line: line
}
var data = new FormData();
data.append("json", JSON.stringify(params));
var promise = fetch("http://mysite/myscript.php", {method: 'POST', body: data})
.then((response) => {
return response.text();
}).then((text) => {
if(text != 'error'){
text = text.replace(/(\r\n|\n|\r)/gm, "");
var result = text.split(" ");
//Result will be an array of those values and will look something like that:
//["Cheese", "Milk", "Yogurt"]
}
else{
alert('error');
}
});
}
А потом на бэкэнде это выглядит так:
$json = (array) json_decode($_POST['json']);
if( validatePath($json['path']) ){
$file = file($json['path']);
$my_string = $file[$json['line']];
echo $my_string;
}
else{
echo 'error';
}
function validatePath($path){
//You should definitely use some other validations
$allowedExtensions = ['txt', 'json'];
$pathinfo = pathinfo($path);
//Right now it's only checking for right extension and
//that's this file ain't located in admin subdir
if(strstr($pathino['dirname'], '/admin') || !in_array($pathinfo['extension'], $allowedExtensions)){
return false;
}
else{
//Check if file exists
if( file_exists($path) ){
return true;
}
else{
return false;
}
}
}
Хотя не каждый браузер поддерживает fetch
, и если вы хотите поддерживать больше браузеров, вам понадобится полифилл.