2010-09-10 24 views

Respuesta

5
$string = 'This is a test string to see how to grab words from an arbitrary sentence. It\'s a little hacky (as you can see from the results) - but generally speaking, it works.'; 

echo $string,'<br />'; 

function getWords($string,$word,$before=0,$after=0) { 
    $stringWords = str_word_count($string,1); 
    $myWordPos = array_search($word,$stringWords); 

    if (($myWordPos-$before) < 0) 
     $before = $myWordPos; 
    return array_slice($stringWords,$myWordPos-$before,$before+$after+1); 
} 

var_dump(getWords($string,'test',2,1)); 
echo '<br />'; 
var_dump(getWords($string,'this',2,1)); 
echo '<br />'; 
var_dump(getWords($string,'sentence',1,3)); 
echo '<br />'; 
var_dump(getWords($string,'little',2,2)); 
echo '<br />'; 
var_dump(getWords($string,'you',2,2)); 
echo '<br />'; 
var_dump(getWords($string,'results',2,2)); 
echo '<br />'; 
var_dump(getWords($string,'works',2,2)); 

echo '<hr />'; 


function getWords2($string,$word,$before=0,$after=0) { 
    $stringWords = str_word_count($string,1); 
    $myWordPos = array_search($word,$stringWords); 
    $stringWordsPos = array_keys(str_word_count($string,2)); 

    if (($myWordPos+$after) >= count($stringWords)) 
     $after = count($stringWords) - $myWordPos - 1; 
    $startPos = $stringWordsPos[$myWordPos-$before]; 
    $endPos = $stringWordsPos[$myWordPos+$after] + strlen($stringWords[$myWordPos+$after]); 

    return substr($string,$startPos,$endPos-$startPos); 
} 

echo '[',getWords2($string,'test',2,1),']<br />'; 
echo '[',getWords2($string,'this',2,1),']<br />'; 
echo '[',getWords2($string,'sentence',1,3),']<br />'; 
echo '[',getWords2($string,'little',2,2),']<br />'; 
echo '[',getWords2($string,'you',2,2),']<br />'; 
echo '[',getWords2($string,'results',2,2),']<br />'; 
echo '[',getWords2($string,'works',1,3),']<br />'; 

Pero, ¿qué quieres que suceda si la palabra aparece varias veces? O si la palabra no aparece en la cadena?

EDITAR

Versión ampliada del getWords2 para regresar hasta un número determinado de veces que aparece la palabra clave

$string = 'PHP is a widely-used general-purpose scripting language that is especially suited for Web development. The current version of PHP is 5.3.3, released on July 22, 2010. The online manual for PHP is an excellent resource for the language syntax and has an extensive list of the built-in and extension functions. Most extensions can be found in PECL. PEAR contains a plethora of community supplied classes. PHP is often paired with the MySQL relational database.'; 

echo $string,'<br />'; 

function getWords3($string,$word,$before=0,$after=0,$maxFoundCount=1) { 
    $stringWords = str_word_count($string,1); 
    $stringWordsPos = array_keys(str_word_count($string,2)); 

    $foundCount = 0; 
    $foundInstances = array(); 
    while ($foundCount < $maxFoundCount) { 
     if (($myWordPos = array_search($word,$stringWords)) === false) 
      break; 
     ++$foundCount; 
     if (($myWordPos+$after) >= count($stringWords)) 
      $after = count($stringWords) - $myWordPos - 1; 
     $startPos = $stringWordsPos[$myWordPos-$before]; 
     $endPos = $stringWordsPos[$myWordPos+$after] + strlen($stringWords[$myWordPos+$after]); 

     $stringWords = array_slice($stringWords,$myWordPos+1); 
     $stringWordsPos = array_slice($stringWordsPos,$myWordPos+1); 

     $foundInstances[] = substr($string,$startPos,$endPos-$startPos); 
    } 
    return $foundInstances; 
} 

var_dump(getWords3($string,'PHP',2,2,3)); 
+0

Hola Marcos, gracias, si la palabra aparece varias veces, entonces quiero armar un fragmento de múltiplos, digamos hasta 3 iteraciones más o menos. así que el resultado final podría ser así: se trata de KEYWORD que trata sobre ... esta es otra pieza de rompecabezas de KEYWORD ... esta sería KEYWORD la tercera pieza –

+0

Lo que estoy tratando de hacer es dar suficientes detalles acerca de lo que cada El resultado es, sin el ser muy similar el uno al otro. –

+0

Eso funciona como un amuleto, muchas gracias Mark :) –

Cuestiones relacionadas