1

単語を(ファイルまたはデータベースの)リストからHTMLWebサイトのリンクに変更したい。str_replaceを使用しましたが、すでにリンクauchorにある単語の置換に問題があります。

例えば。私はこのようなhtmlを持っています:

Lorem ipsum donor et simet <a>lorem ipsum</a> eta raoa talkesa z uta.

すべての「ipsum」をリンクに置き換えたいのですが、[a] loremipsum[a]のipsumをスキップします。わからない、maby preg_replace?

4

1 に答える 1

2

したがって、HTML の本文内でリンクする必要がある単語のリストがあると理解しています。str_replace() はそれを処理しますが、既にアンカー内にあるリンクは処理しませんか?

アンカータグ内にある場合、一致する単語を無視しますか?

PHP は可変幅の否定後読みをサポートしていないため、ヘッド アンカー タグは可変長であるため、一致した単語の前にアンカー タグがある場合、一致しないと簡単に言うことはできません。

この種の問題を処理する方法は、それらをすべて置き換えてから、行うべきではない変更を元に戻すことです。

<?php
// Setup data
$words = array('lorem' => 'www.google.com',
               'ipsum' => 'www.bbc.co.uk',
               'test' => 'www.amazon.co.uk');

$textBody = '<p>This is a short test of <a href="www.slashdot.org">lorem ipsum</a> automatic anchoring.  Let us see if it works, any incidences of lorem or ipsum, should be caught.</p>';

// Make basic replacements, but use a different tag than anchor
// so it can be detected separately from previously existing anchors
// I am using the <argh> tag

$wordExpressions = array();
$wordReplacements = array();
foreach ($words as $cWord => $cLink) {
  $wordExpressions[] = '#' . preg_quote($cWord) . '#';
  $wordReplacements[] = '<argh href="' . $cLink . '">' . $cWord . '</argh>';
}

$replacedText = preg_replace($wordExpressions, $wordReplacements, $textBody);

// At the moment, there are nested anchors
echo $replacedText;

// Use a fairly horrific recursive anchor tag callback replacement to delete any
// <argh> tags inside <a> tags
$replacedText =
  preg_replace_callback("#(<a [^>]*>)((?:[^<]|<(?!/?a>)|(?R))+)(</a>)#",
                        create_function('$a', 'return $a[1] . preg_replace("#<argh[^>]*>(.*?)</argh>#", "$1", $a[2]) . $a[3];'),
                        $replacedText);

// No nested anchors now
echo $replacedText;

// Finally replace the <argh> tags with straight <a>s
$replacedText = preg_replace(array('#<argh #', '#</argh>#'), array('<a ', '</a>'), $replacedText);

// The output should now be correct
echo $replacedText;
?>

これは、特に再帰的な正規表現コールバックで、実際よりも少し悪いように見えます。ペアのアンカー タグを照合し、その一致を関数に渡すだけです。この関数は、パッチを適用したペアを単純に返し、内部コンテンツから新しいタグを取り除きます。Jeffery Friedl による「Mastering Regular Expressions」には、再帰的置換の使用に関する適切な議論があります。

タグは何でもかまいませんが、HTML に存在する可能性は非常に低く、当面の問題に適していると思われるため、この単語を使用しました。:-)

そのようなものはあなたのために働きますか?

于 2010-10-11T14:26:06.597 に答える