Quiero saber cómo puedo hacer coincidir la(s) palabra(s) después de la última instancia de by . Por ejemplo, a continuación tengo una lista de $books . El libro tiene el formato <book title> by <author> El título del libro puede contener cualquier personaje o nada en absoluto. Sin embargo, el autor sólo puede ser letras, números y guiones bajos. Quiero hacer eco de los autores solamente.
Me las arreglé para hacer esto con una combinación de explode() , rtrim() y end() pero ¿cómo haría esto usando preg_match/regex?
<pre><?php $books = ['Big Blue Book by Steven', 'Dance by her by Mike', 'One day by by by', 'Hiphop Party by DJ340_Cool', ' by Paul12', 'by jasonB']; foreach ($books as $book) { $temp = explode("by ", $book); $temp = rtrim(end($temp)); echo("$temp\n"); }El resultado que quiero:
Steven Mike by DJ340_Cool Paul12 jasonBPuedes usar este código:
foreach ($books as $book) { if (preg_match('/^(?:.*\h)?by\h+(\S+)/', $book, $m)) echo $m[1] . "\n"; }Producción:
Steven Mike by DJ340_Cool Paul12 jasonB Aquí regex (?:^.*\h)?by\h+(\S+) coincide con el último rodeado by 1+ espacios en blanco en ambos lados debido al uso de greedy .* antes. Capturamos 1+ espacios que no son en blanco en el primer grupo de captura y lo imprimimos en condición if .