1

文字列内の単語を検索してリンクする簡単な関数を作成しようとしています。問題は、単語の末尾にドットまたはコンマが含まれている場合があり、それを保持したいということです。text word.に変更する必要がありtext <a href="#">word</a>.ます。text <a href="#">word</a>

これが今までの私の機能です。機能しない理由がわかりません:

$string = "words are plenty in the world. another world and another world,comma.";

function findWord ($string, $word, $link) {
    $patt = "/(?:^|[^a-zA-Z])(" . preg_quote($word, '/') . ")(?:$|[^a-zA-Z])/i";
    return preg_replace($patt, ' <a href="'.$link.'" class="glossary-item">'.$word.'</a>$3', $string);
}

echo findWord ($string, "world", "#");
4

1 に答える 1

1

(?:...)検索語を囲む可能性のある文字を一致させるために非キャプチャ グループを使用$3しましたが、それらがキャプチャ グループであるかのように使用します(...)

したがって、$3常に空になります。代わりにキャプチャ グループを使用することもできます。

function findWord ($string, $word, $link) {
    $patt = "/(^|[^a-zA-Z])(" . preg_quote($word, '/') . ")($|[^a-zA-Z])/i";
    return preg_replace($patt, '$1<a href="'.$link.'" class="glossary-item">'.$word.'</a>$3', $string);
}

(ただし、文字列で置き換えることも忘れない$1でください!) または、否定的なルックアラウンド アサーションを使用します。

function findWord ($string, $word, $link) {
    $patt = "/(?<![a-zA-Z])(" . preg_quote($word, '/') . ")(?![a-zA-Z])/i";
    return preg_replace($patt, '<a href="'.$link.'" class="glossary-item">'.$word.'</a>', $string);
}

私は後者の方が好きです。

于 2013-07-07T09:51:56.557 に答える