0

My raw output of socket_recvfrom is:

ID IP PING IDENTIFIERNUMBER USERNAME


0 127.0.0.1:1234 0 ID123456789 Moritz

1 127.0.0.1:1234 46 ID123456789 August Jones

2 127.0.0.1:1234 46 ID123456789 Miller


It is a single string that contains all of this informations in once and just contains whitespaces between the informations. All keys can be longer or shorter.

My problem:

When I preg_split("/\s+/") it, then I get a good array with useable data, but when the username contains spaces it creates a second index for this. Not good, all data that comes after this just get destroyed.

I sort the array like this: ID, USERNAME, PING, IDENTIFIERNUMBER, IP

Example by the sorting output with username with one space in it:


ID: 0, USERNAME: Moritz, PING: 0, IDENTIFIERNUMBER: ID123456789, IP: 127.0.0.1:1234

ID: 1, USERNAME: August, PING: Jones, IDENTIFIERNUMBER: 46, IP: ID123456789

ID: 127.0.0.1:1234, USERNAME: 2, PING: Miller, IDENTIFIERNUMBER: 46, IP: ID123456789


How do I get the information correctly out of the string?

Just forgot to say:

The string begins with: --------------------------------- in a not countable order. So it can be like 10 characters or 12. The string ends with:

 (8 users in total)

The regex methode looks good. I only need to filter out the other characters.

--------------------------------- 0 127.0.0.1:1234 0 ID123456789(OK) Moritz 1 127.0.0.1:1234 46 ID123456789(OK) August Jones 2 127.0.0.1:1234 46 ID123456789(OK) Miller (7 users in total)

Last problem: https://www.regex101.com/r/wP8cW1/1

7
  • preg_match with explode or preg_match_all Commented Jun 25, 2015 at 18:59
  • Can you update your example strings to show how the --------------------------------- and (8 users in total) are displayed? Commented Jun 25, 2015 at 19:35
  • Edited it at the end Commented Jun 25, 2015 at 19:42
  • I've updated the answer and the demo Commented Jun 25, 2015 at 19:43
  • Is it all on one line? Commented Jun 25, 2015 at 19:47

2 Answers 2

1

You may use regex

(?P<ID>\d+)\s+(?P<IP>\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}:\d+)\s(?P<PINGR>\d+)\s(?P<IDENTIFIERNUMBER>ID\d+)(\(OK\))?(?P<USERNAME>(\s[A-z]\w+)+)

MATCH 1
ID  [0-1]   `0`
IP  [2-16]  `127.0.0.1:1234`
PINGR   [17-18] `0`
IDENTIFIERNUMBER    [19-30] `ID123456789`
USERNAME    [31-37] `Moritz`

MATCH 2
ID  [39-40] `1`
IP  [41-55] `127.0.0.1:1234`
PINGR   [56-58] `46`
IDENTIFIERNUMBER    [59-70] `ID123456789`
USERNAME    [71-83] `August Jones`

MATCH 3
ID  [85-86] `2`
IP  [87-101]    `127.0.0.1:1234`
PINGR   [102-104]   `46`
IDENTIFIERNUMBER    [105-116]   `ID123456789`
USERNAME    [117-123]   `Miller`

Demo and explanation

Sign up to request clarification or add additional context in comments.

8 Comments

Looks awesome, I just edited my post. Maybe you can fix that problem too for me.
You can split by NL and use regex for all lines in foreach loop, for example. On special lines matches will not be occured
2 possible issues, If a username has a number it won't match (looks more like these are "user's names" than "usernames" though). This will allow invalid IPs. \D can also be used in place of [^\d]. I hadn't seen the named capture groups before.
I agree with \D. But i don't know how diff name which is more than one word and has digit :( May be set that 1st letter is not digit
Ok, I got it finally. Like chris said, the username also has digits. How do I filter this?
|
0

Do you alredy try explode the string by new lines \n ??

test this code.

$str = '0 127.0.0.1:1234 0 ID123456789 Moritz
      1 127.0.0.1:1234 46 ID123456789 August Jones
      2 127.0.0.1:1234 46 ID123456789 Miller';

$lines = array_filter(explode("\n", $str)); 

    foreach ($lines as $value) {
        $t[] = preg_split("/\s+/", trim($value));
    }

Now in the var $t you have a usefull data.

1 Comment

Nope, the username just get split into pieces if it contains a whitespaces

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.