regexp: как вставить ссылки в html?

Figure7

Новичок
regexp: как вставить ссылки в html?

Здравствуйте!
Есть HTML-тексты в которых встречаются слово "виноград".
Нужно автоматически проставить ссылки к этому слову <a href=/page_vinograd.htm>виноград</a>, но только там где они не проставлены,
т.е. если это слово размещено ВНЕ тега <a></a>.
После ряда попыток мне удалось получить выражение, кот. наоборот проставляет ссылки там где слово "виноград" стоит в теге <a></a> :(.
$search = "'<a *?[^>].*?виноград.*?</a>'";

В идеале, конечно, нужно отслеживать что бы слово было также вне тега <img>, но это покка ни так важно.

Помогите, пожалуйста, решить задачу.
 

maxwell

artifex
[^>]виноград[^<]

Не работает если слово в начале строки :)
А в принципе, если у тебя есть паттерн который находит <a href=/page_vinograd.htm>виноград</a>, то можешь сделать следующее.

Все ссылки уже проставленные заменить на bbb
Проставить ссылки
Заменить bbb на ссылки.
Как-то так.
 

Figure7

Новичок
Спасибо за ответ maxwell!

Дело в том, что уже имеющаяся ссылка в теге <a>виноград</a> не обязательно на страницу page_vinograd.htm. Там может быть ссылка и на другую страницу. Суть как раз в том, что бы эти ссылки сохранить.

А паттерн действительно не тот указал, запутался уже :)
 

Figure7

Новичок
Задачу я таким образом (заменой) решил, за что огромное спасибо тебе, maxwell.
PHP:
function ins_link($str, $word, $link)
{
	$search = "'<([aA])(.*?)>(.*?)($word)(.*?)</[aA]>'";
	$str = preg_replace($search, "<bbb $2>$3ggggg$5</bbb>", $str);
	$str = preg_replace("'$word'", "<a href=$link>$word</a>", $str);
	$search = "'<bbb (.*?)>(.*?)ggggg(.*?)</bbb>'";
	$str = preg_replace($search, "<a $1>$2$word$3</a>", $str);
	return $str;
}
Я просто уперся в то, что бы сделать это одним выражением. А решение оказалось простое. Но все же интересно: не уже ли одним выражением это сделать нельзя?
 

WP

^_^
Люди не курите больше эту траву.
PHP:
class re_figure
{
 public $string = '';
 public $words = array();
 public function __construct($string,$words)
 {
  $this->string = $string;
  $this->words = $words;
 }
 private function callback($m)
 {
  if (isset($m[3]) && ($m[3] !== ''))
  {
   return '<a href="'.htmlspecialchars($this->words[$m[3]],ENT_QUOTES).'">'.htmlspecialchars($m[3],ENT_QUOTES).'</a>';
  }
  return $m[0];
 }
 public function __toString()
 {
  $q_words = array();
  $k = array_keys($this->words);
  for ($i = 0, $s = sizeof($k); $i < $s; ++$i) {$q_words[] = preg_quote($k[$i],'~');}
  return sizeof($q_words)?preg_replace_callback('~<(a)\b.*?>((?:(?R)|.)*?)</\1>|\b('.implode('|',$q_words).')\b~i',array($this,'callback'),$this->string):$this->string;
 }
}
$re = new re_figure('виноград <a href=/page_vinograd.htm>виноград <a> 1 </a></a> виноград',array('виноград' => '/page_vinograd.html'));
echo (string) $re;
//<a href="/page_vinograd.html">виноград</a> <a href=/page_vinograd.htm>виноград <a> 1 </a></a> <a href="/page_vinograd.html">виноград</a>
 

maxwell

artifex
Сделать можно что угодно.

WP, в чем трава? Выбери мне плыз из потока все слова которые содержат буквы a,b,c.
Буквы могут стоять на любом месте, и они обязательно (все три) должны быть в слове.
 

WP

^_^
maxwell
Трава в кривом решении.
> Выбери мне плыз из потока все слова которые содержат буквы a,b,c.
Напиши программу которая сделает тебе выражение.... \w*a\w*a\w*a\w*|
\w*a\w*a\w*b\w*|
\w*a\w*a\w*c\w*|
....

И вперед :))

-~{}~ 26.06.08 17:18:

/me тихо сполз от смеха
 

maxwell

artifex
WP
А выбрать сначала все слова содержащие a, потом содержащие b и c (3 выражениями) не легче, и не логичнее?

Если поделишься своей травой, покурим.
 

WP

^_^
maxwell
Интереснее одним. Кстати, есть красивое решение 1 выражением. Попробуй додуматься.
 

maxwell

artifex
WP, интереснее? чем?
Программы пишутся для людей, а не для машин. Поэтому чем логичней и понятней, тем «интересней» и «красивей».

По поводу 1 выражением, подумаю, но могу не додуматься, также могу забить. Все-таки работа.
 

WP

^_^
maxwell
> Программы пишутся для людей, а не для машин.
Тебя обманули, можно даже сказать нае****.

Ок, подумай.
 

maxwell

artifex
WP, ха ха. Можем поспорить. Только, видимо, без толку.
по поводу регэкспа, подумал, ничего «красивей» моего варианта не придумал.
 
Сверху