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,NULL,PREG_SPLIT_NO_EMPTY); // declare with all non-white-space substrings from first text }else{ $overlaps=array_intersect($overlaps,preg_split('/\s+/',$string,NULL,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:
29.37 ms | 409 KiB | 5 Q