#php #string #explode
#php #строка #взорваться
Вопрос:
У меня есть вывод сервера, который выглядит следующим образом
PLAYER_ENTERED name ipaddress username
Если строка содержит PLAYER_ENTERED, внутри строки всегда будет 3 пробела, разделяющих ее (как это можно изменить, чтобы это тоже выполнялось?). Я хотел бы распечатать только ip-адрес и имя пользователя (последние 2 раздела). Как это можно сделать?
Это код, который печатает все целиком:
$q = $_REQUEST["ipladder"];
$f = fopen("ladderlog.txt", "r");
while (($line = fgets($f)) !== FALSE)
{
if (strstr($line, $q))
{
print "<li>$line";
}
Я представляю это с помощью explode (), но я отказался от попыток, так как я твердо знаю, как кодировать php.
Желаемый результат
имя пользователя ip-адрес
Комментарии:
1. Пожалуйста, приведите пример того, как это должно выглядеть, как обычно, так и сокращенно.
Ответ №1:
$q = $_REQUEST["ipladder"];
$f = fopen("ladderlog.txt", "r");
while (($line = fgets($f)) !== FALSE)
{
if (strstr($line, $q))
{
$data = explode(" ", $line); // split using the space into an array
// array index 0 = PLAYER_ENTERED
print "IP:" . $data[1]; // array index 1 = IP
print "Name: " . $data[2]; // array index 2 = name
}
}
Комментарии:
1. Спасибо, это отлично работает! Следующий вопрос, если вы не возражаете, но как мне проверить наличие дубликатов, например, иметь 2 экземпляра с одинаковым именем и IP
2. Для этого есть несколько разных способов. Это еще один совершенно новый вопрос, но здесь есть с чего начать. php.net/manual/en/function.file.php , php.net/manual/en/function . array-diff.php
Ответ №2:
Вы можете использовать substr()
, чтобы проверить, равны ли первые 14 символов $line
PLAYER_ENTERED, а затем использовать list()
и explode()
для извлечения данных из строки.
$q = $_REQUEST["ipladder"];
$f = fopen("ladderlog.txt", "r");
while(($line = fgets($f)) !== FALSE)
{
if(substr($line, 0, 14) == 'PLAYER_ENTERED'){
list($event, $name, $ip, $username) = explode($string); // here they come!
echo 'Name: ' . $name . ', ip: ' . $ip . ', username: ' . $username;
}
}
Комментарии:
1. Моя ошибка, пожалуйста, попробуйте еще раз 🙂
Ответ №3:
попробуйте это …
<?
$str = "PLAYER_ENTERED name 108.21.131.56 username";
if ( preg_match( "~^(. )s (. )s ([d.] )s (. )$~msi", $str, $vv ))
echo $vv[3] . " and " .$vv[4] ;
else "N/A";
?>
IMHO Perl regexp — это правильный способ разбора строк…
Комментарии:
1. Кевин, это пример … это не связано с каким -либо именем или ip 🙂 Измените строку … чтобы увидеть разницу, также не связанную с количеством пробелов. «~^(. )s (. )s ([d.] )s (. )$~msi»
Ответ №4:
Одним из способов было бы:
$tokens = explode(' ', $line);
if (count($tokens) == 4 amp;amp; $tokens[2] == $q) {
printf('IP: %s Username: %s', $tokens[2], $tokens[3]);
}
Ответ №5:
<?php
$str = 'PLAYER_ENTERED name 108.21.131.56 username';
$data = explode(" ", $str )
print_r($data)
?>