2

PHP には、文字列 $string と配列 $acronyms ("UK" => "United Kingdom" の形式) があります。

ここで、$string 内のすべての頭字語をいくつかの HTML タグに置き換えたいと考えています。たとえば、次のようHello UKになりますHello <acronym title="United Kingdom">UK</acronym></pre>

私はこのようにします:

foreach($acronyms as $acronym => $tooltip){
     $string = preg_replace('/'.$acronym.'/i', ''.$acronym.'', $string);
}

Hello UK問題は次のとおりです。テキストがあり、「UK」を「United Kingdom」に、「Kingdom」を「RandomWord」に置き換える配列があるとしましょう。Hello <acronym title="United <acronym title="RandomWord">Kingdom</acronym>">UK</acronym>次に、明らかにカオスであるテキストが置き換えられます。

質問は次のとおりです: preg_replace がタグ内にない単語のみを検索するようにするにはどうすればよいですか? <acronym>(タイトル属性にも、タグ自体にもありません)

編集:応答による2回目の試行(応答にコードを入れることができないため)。それでも同じ問題、頭字語内のテキストがもう一度置き換えられます...

foreach($acronyms as $acronym => $tooltip){
        $acronyms[$acronym] = '<acronym title="'.$tooltip.'">'.$acronym.'</acronym>';
}
$string = str_ireplace(array_keys($acronyms), array_values($acronyms), $string);

4

3 に答える 3

1

使用できますstrtr()。置換を実行した後に文字列を再スキャンしません。

foreach ($acronyms as $acronym => $tooltip) {
    $acronyms[$acronym] = sprintf('<acronym title="%s">%s</acronym>',
        htmlspecialchars($tooltip),
        htmlspecialchars($acronym)
    );
}

echo strtr($str, $acronyms);
于 2013-01-27T11:56:54.717 に答える
0

正規表現バージョンでの試みは次のとおりです。

foreach($acronyms as $acronym => $tooltip){
    $rexp = '/' . $acronym . '(?!((?!<acronym).)*<\/acronym>)/i';
    $string = preg_replace($rexp, ''.$acronym.'', $string);
}

私にはうまくいくようです。次のことを行います。

  1. $acronym 変数を負の先読みと一致させます...
  2. 頭字語の終了タグがある場所
  3. ただし、頭字語の開始タグが前にある場合は、先読みを停止します。

最終的に、これは頭字語タグ (タイトルなどのすべての属性を含む) 内にない場合にのみ一致します。

実際の例を次に示します: gSkinner regex example

于 2013-01-27T11:46:10.473 に答える
0

すべてを正規表現でやろうとしないでください:

  1. HTML/XML 解析ライブラリを使用して HTML を解析します。
  2. HTML タグを反復処理し、置き換える必要があるものを置き換えます。
  3. 「html解析ライブラリ」にこれを「HTML文字列」に変換するよう依頼してください。
于 2013-01-27T17:13:55.290 に答える