3v4l.org

run code in 300+ PHP versions simultaneously
<?php $posts['Author1'] = ['sdsadsad daSDA DDASd asd aSD Sd dA SD ASD sadasdasds sadasd @jhsad.sadas.com sdsdADSA sada', 'KDJKLFFD GFDGFDHGF GFHGFDHGFH GFHFGH Lklfgfd gdfsgfdsg df gfdhgf g hfghghjh jhg @jhsad.sadas.com sfgff fsdfdsf', 'jhjkfsdg fdgdf sfds hgfj j kkjjfghgkjf hdkjtkj lfdjfg hkgfl @jhsad.sadas.com dsfjdshflkds kg lsfdkg;fdgl']; $posts['Author2']=['This is some random string representative of non-signature text. This is the *author\'s* signature.', 'Different message body text. This is the *author\'s* signature. This is an afterthought that expresses that a signature is not always at the end.', 'Finally, this is unwanted stuff. This is the *author\'s* signature.']; foreach ($posts as $author => $texts) { echo "Author: $author\n"; usort($texts, function($a, $b) { return strlen($a) <=> strlen($b); // sort ASC by strlen; mb_strlen probably isn't advantageous }); var_export($texts); echo "\n"; foreach ($texts as $index => $string) { if (!$index) { $overlaps = preg_split('/\s+/', $string, 0, PREG_SPLIT_NO_EMPTY); // declare with all non-white-space substrings from first text } else { $overlaps = array_intersect($overlaps, preg_split('/\s+/', $string, 0, PREG_SPLIT_NO_EMPTY)); // filter word bank using narrowing number of words } } var_export($overlaps); echo "\n"; // batch consecutive substrings $group = null; $consecutives = []; // clear previous iteration's data foreach ($overlaps as $i => $word) { if ($group === null || $i - $last > 1) { $group = $i; } $last = $i; $consecutives[$group][] = $word; } var_export($consecutives); echo "\n"; foreach ($consecutives as $words) { // match potential signatures in first text for measurement: if (preg_match_all('/\Q' . implode('\E\s+\Q', $words) . '\E/', $texts[0], $out)) { // make alternatives characters literal using \Q & \E $potential_signatures = $out[0]; } } usort($potential_signatures, function($a, $b){ return strlen($b) <=> strlen($a); // sort DESC by strlen; mb_strlen probably isn't advantageous }); echo "Assumed Signature: {$potential_signatures[0]}\n\n"; }

preferences:
170.74 ms | 409 KiB | 5 Q