2017-02-02 1 views
0

Ich benutze preg_match, um exakte Wörter und Sätze zu finden und sie durch AHREF Links zu ersetzen. Ich benutze Wortgrenze Regex, aber es funktioniert nicht richtig. Es passt in Worte.Pregmatch mit Word-Grenze Regex funktioniert nicht wie erwartet

Beispiel: "Ringe" wird auf "Ohr Ringe" angepasst. Ich will das nicht. Ich will nur 'Ringe'

Ist meine preg_match Regex falsch?

$keyword="rings"; 

$text="women's earrings, clothing rings, earrings, rings"; 

if (preg_match("/\b$keyword\b/i",$text)) 

Kursiv sollen unter

output = "women's ear*rings*, clothing *rings*, ear*rings*, *rings*"

erwartet = "women's earrings, clothing *rings*, earrings, *rings*"

Update Ich denke, das Problem in der Ersetzen-Funktion ist unterstrichen werden:

function str_replace_first($from, $to, $subject) 
    { $from = '/'.preg_quote($from, '/').'/'; 
    return preg_replace($from, $to, $subject,2); 
    } 

if (preg_match_all("/\b$keyword\b/i",$text,$matches)>0) 
    { 
       print_r($matches)."<p> "; 

      $ahref="<a href='$anchor_url'>$keyword</a>"; 
      $text=str_replace_first($keyword, $ahref, $text); 
      } ELSE { 

       echo "<p>no Match<br>"; 
      } 
echo $text; 
+0

Ist Ihre Frage nicht mehr zum Ersetzen als nur zum Abgleich? Sind Sie sicher, dass es nicht der Code danach ist (Sie haben nicht gezeigt), der Aufmerksamkeit benötigen könnte? – mario

+0

ja aktualisiert den Code. Ich denke, das Problem ist in der Replace-Funktion – hjayne

+0

Versuchen Sie 'preg_replace ($ aus, $ zu, $ Subjekt, 1);' (Sie haben '2' - ersetzen Sie zwei Treffer). –

Antwort

0

Verwenden preg_replace direkt, ohne die Spiele zu sammeln, da Sie nicht wirklich wollen, sie benutzen (Sie müssen sie nur mit einigen anderen Texten einpacken):

$keyword="rings"; 
$anchor_url = "http_//www.t.tt"; 
$url = "<a href='$anchor_url'>\$0</a>"; 
$text="women's earrings, clothing rings, earrings, rings"; 
$newtxt = preg_replace('/\b' . preg_quote($keyword, '/') . '\b/i', $url, $text); 
if ($newtxt != $text) { 
    echo $newtxt; 
} else { echo "No matches!"; } 

die PHP demo See.

Beachten Sie, dass Sie \b Wortgrenzen benötigen, um ein ganzes Wort zu finden. Sie müssen auch das Schlüsselwort preg_quote eingeben und das Regex-Trennzeichen ebenfalls entfernen. Da Sie eine regex ohne Berücksichtigung der Groß-/Kleinschreibung verwenden, können Sie nicht $keyword verwenden, die in der Ersetzung fest codiert ist. Sie müssen die Rückreferenz $0 für die gesamte Übereinstimmung verwenden. Wenn Sie überprüfen müssen, ob keine Übereinstimmung vorhanden ist, vergleichen Sie einfach eine neue Zeichenfolge mit der ursprünglichen Zeichenfolge.

Verwandte Themen