2009-12-22 10 views
5

mi hanno una serie di parole comeRegex: Incontro parole frase PHP

$arr = array("go", "walk", ...) 

Vorrei sostituire queste parole con i collegamenti f essi sono abbinati a frasi. Ma dovrebbe essere solo se corrispondono esattamente

e la sostituzione dovrebbe essere un semplice link simili (per esempio "passeggiata" dovrebbe corrispondere a "Walk" o, ma non anche "a piedi" "camminare!"): < a href='#walk' >walk</a>

Qualcuno Qualche idea?

+0

Per esempio considera questa frase "Vado a scuola, cammino sempre". –

risposta

8

Per abbinare ogni parola come "camminare" ma non "camminare" Utilizzare \ b per il limite di parola.

per esempio, "\bwalk\b"

+0

Ho provato questo esempio: Ma ottengo: Avviso: preg_replace(): il delimitatore non deve essere alfanumerico o rovesciato –

+0

Sono necessari delimitatori sul modello come $ modello = "/ \ bwalk \ b/i". Il quantificatore lo rende insensibile al maiuscolo/minuscolo. – Residuum

+0

Grazie mille! –

2

provare qualcosa di simile:

$words = array('walk','talk'); 

foreach($words as $word) 
{ 
    $word = preg_replace("/\b$word\b/","< a href='#$word' >$word</a>",$word); 
} 
0

I suoi esempi sono molto specifici, quindi è difficile sapere esattamente che cosa è necessario far corrispondere in pratica (ad esempio, fanno si desidera includere il nel link), ma provate questo '!':?

<?php 

$text = "Walk! I went for a walk today. I like going walking. Let's go walk!"; 
$needles = array('go', 'walk'); 

foreach ($needles as $needle) 
    $text = preg_replace('/\b(' . $needle . ')\b/i', '<a href="#' . $needle . '">$1</a>', $text); 

print $text; 
4
function magicWords($words, $string) { 
    $from = $to = array(); 
    foreach($words as $word) { 
    $from[] = "/\b$word\b/i"; // \b represents a word boundary 
    $to[] = '<a href="#' . strtolower($word) . '">${0}</a>'; 
    } 

    return preg_replace($from, $to, $string); 

} 

$words = array('go', 'walk'); 

echo magicWords($words, "Lets go walking on a Walk"); 

Questo uscite:

'Lets <a href="#go">go</a> walking on a <a href="#walk">Walk</a>.' 

notare che corrisponde a "go", e "camminare", ma non "a piedi", e mantiene la D maiuscola sulla camminata mentre il collegamento diventa minuscolo "#walk".

In questo modo, "Walk walk WALK wALk" si collegherà a #walk senza influire sulla formattazione originale.

1

Penso che il seguente potrebbe essere quello che vuoi.

<?php 
$someText = 'I don\'t like walking, I go'; 
$words = array('walk', 'go'); 
$regex = '/\\b((' . implode('|',$words) . ')\\b(!|,|\\.|\\?)?)/i'; 
echo preg_replace_callback(
    $regex, 
    function($matches) { 
     return '<a href=\'' . strtolower($matches[2]) . '\'>' . $matches[1] . '</a>'; 
    }, 
    $someText); 
?> 

Alcuni dei punti però:

  • Questa soluzione e tutti gli altri Restituirà tutte le occorrenze della parola suddivisi in elemento di attributi o qualsiasi altra cosa
  • ho aggiunto un po ' terminare per la corrispondenza di punteggiatura se si desidera includerla nei tag link/anchor.
  • Ciò richiede php 5.3 funzioni anonime. Ho pensato che questa fosse un'alternativa interessante ai metodi di foreach menzionati
Problemi correlati