1

私のコードは

$words = array();
$links = array();
$result = mysql_query("SELECT `keyword`, `link` FROM `articles` where `link`!='".$act."' ") 
or die(mysql_error());
$i = 0;
while($row = mysql_fetch_array( $result )) 
{
if (!empty($row['keyword']))
{
$words[$i] = '/(?<!(src="|alt="))'.$row['keyword'].'/i';
$links[$i] = '<a href="'.$row['link'].'.html" class="ared">'.$row['keyword'].'</a>';
$i++;
}
}
$text = preg_replace($words, $links, $text);

Hello を img src と alt 以外の Guys に置き換えたいです。

から

Say Hello my dear <img src="say-hello-my-dear.jpg" alt="say hello my dear" />

私が欲しい

Say Guys my dear <img src="say-hello-my-dear.jpg" alt="say hello my dear" />

現在のコードは、キーワードが 1 単語しかない場合にのみ置き換えられます。

4

3 に答える 3

1

編集: HTML の大きな塊を正規表現で解析しようとしていることを理解するのに、こんなに時間がかかったなんて信じられません。この質問への回答をお読みください: 正規表現は XHTML 自己完結型タグを除く開始タグに一致します

于 2013-04-01T22:46:50.690 に答える
1

編集: 以前に提案された修正は関係ありませんでした。

まだ:

于 2013-04-01T22:42:38.593 に答える
0

編集:コードを更新して、より適切に機能するようにしました。

問題が何であるか正確にはわかりませんが、あなたのコードを見ると、「キーワード」がsrcまたはaltの後の最初の単語ではない複数の単語文字列に正規表現の背後にある否定的な外観が一致しないことに驚かないでしょう. 正規表現を強化することは可能かもしれませんが、複雑な正規表現は、html 解析のニーズに対して少し脆弱すぎる可能性があります。自分で基本的な html 解析を行い、適切な場所で単純な文字列置換を行うことをお勧めします。

ここにいくつかの基本的なコードがあります。これよりもはるかに優れた解決策があることは確かですが、これについてはあまり時間をかけません。おそらく、テキスト ノードに html を挿入するのではなくa、適切な属性を持つ新しい html 要素を作成する必要があります。その後、それをデコードする必要はありません。しかし、これが私の基本的なアプローチになります。

$text = "Lorem ipsum <img src=\"lorem ipsum\" alt=\"dolor sit amet\" /> dolor sit amet";

$result = array(
  array('keyword' => 'lorem', 'link' => 'http://www.google.com'),
  array('keyword' => 'ipsum', 'link' => 'http://www.bing.com'),
  array('keyword' => 'dolor sit', 'link' => 'http://www.yahoo.com'),
);

$doc = new DOMDocument();
$doc->loadHTML($text);
$xpath = new DOMXPath($doc);

foreach($result as $row) {
  if (!empty($row['keyword'])) {
    $search = $row['keyword'];
    $replace = '<a href="'.$row['link'].'.html" class="ared">'.$row['keyword'].'</a>';

    $text_nodes = $xpath->evaluate('//text()');
    foreach($text_nodes as $text_node) {
      $text_node->nodeValue = str_ireplace($search, $replace, $text_node->nodeValue);
    }
  }
}

echo html_entity_decode($doc->saveHTML());

データ構造は、の$result結果に似ていることを意図していますmysql_fetch_array()。作成された html DOMDocument のルートの子のみを取得しています。がより複雑な場合は$text、ドキュメントをより完全にトラバースするのは非常に簡単です。これがお役に立てば幸いです。

于 2013-04-02T00:13:49.253 に答える