0

私は次のテキストを持っています:

「これはテストテキストです。テスト、スペースの代わりにカンマを使用してください。」

各単語を繰り返し処理し、各単語を個別のリンクに置き換えたいと思います。まあ言ってみれば

<a href="wordToReplace">wordToReplace</a>

私の問題は、「テスト」という単語の連続した一致(上記の例を使用するため)がhrefとアンカーテキストを置き換えるため、リンク内のリンクがまったく良くないままになることです。

(私の問題の基本的な考えを与えるために、これは私が残しているものです。いくつかの追加のマークアップがあります。)

This is a<a href="/index.php?r<a href="/index.php?r=texts/addWord"
class="wordLink info label" id="yt2">text</a>/addWord" class="wordLink
info label" id="yt1">test</a>text.<a href="/index.php?r=texts/addWord"
class="wordLink info label" id="yt3">Test</a><a
href="/index.php?r=texts/addWord" class="wordLink info label"
id="yt4">comma</a>instead of<a href="/index.php?r=texts/addWord"
class="wordLink info label" id="yt6">space</a>

私はしようとしています

preg_replace("/[^\">]".$word."[^\"<]/", $link, $text->text);

しかし、私はまったく正しい方向に進んでいるとは思いません。

時間をありがとう

4

1 に答える 1

1

あなたの1行のコードから、私はあなたがあなたが$words置き換えたいすべてを繰り返すループの中にその行を持っていると仮定しています、それは問題を引き起こします。

あなたがする必要があるのは、それらすべての置き換えを1回のpreg_replace呼び出しに入れることです。そのために、正規表現は代替手段を提供します。つまり、単語のリストは、、およびで構成されていたtesttextthisます。次に、次のことができます。

preg_replace('/(test|text|this)/', $link, $text->text);

また、すべての単語が配列$wordsに含まれている場合は、次のコマンドを使用して正規表現を生成できます。

$wordList = implode('|', $words);
preg_replace('/('.$wordList.')/', $link, $text->text);

i小切手が大文字と小文字を区別しないと想定される場合は、正規表現の最後にを追加することをお勧めします。

一部の単語が他の単語の一部である場合(たとえば、textandを置き換えたいtexture場合)、単語の境界を確認できます。

preg_replace('/\b('.$wordList.')\b/', $link, $text->text);

これはあなたが探しているものですか?

編集:$link以前にループ内のすべてに対して事前に生成されていた場合$wordは、その単語を。に置き換えることができます$1。あなたの$linkようなものだったら

$link = '<a href="'.$word.'">'.$word.'</a>';

これで、簡単に使用できます

$link = '<a href="$1">$1</a>';
于 2012-09-24T20:12:37.617 に答える