PHP заменяет слова на ссылки, кроме изображений

Мой код

$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.

Из

 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 слово.

EDIT: ранее предложенная коррекция не имела значения.

Все еще:

  • Я бы предложил вам не использовать какое-либо регулярное выражение, а только str_replace в вашем случае, если у вас есть ограничение производительности.
  • Вы должны изменить свои MySQL-функции, которые являются устаревшими: http://php.net/manual/en/function.mysql-fetch-array.php

EDIT: Я не могу поверить, что мне потребовалось столько времени, чтобы понять, что вы пытаетесь разобрать большие куски HTML с регулярными выражениями. Прочтите ответ на этот вопрос: теги OpenEx для OpenEx, за исключением тегов XHTML

Изменить: я обновил код, чтобы работать лучше.

Я не уверен, в чем проблема, но глядя на ваш код. Я не удивлюсь, что негативный внешний вид регулярного выражения не соответствует нескольким строкам слов, где «ключевое слово» не является первым словом после src или alt. Возможно, это может усилить регулярное выражение, но IMHO сложное регулярное выражение может быть слишком хрупким для ваших потребностей синтаксического анализа html. Я бы порекомендовал сделать некоторые основные html-синтаксические разборки и сделать простую замену строки в нужных местах.

Вот базовый код. Конечно, гораздо лучшее решение, чем это, но я не собираюсь тратить слишком много времени на это. Возможно, вместо того, чтобы вставлять html в текстовый узел, вы должны создать новый 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 более сложный, нужно довольно легко пройти через документ более тщательно. Я надеюсь, это поможет вам.