php preg_replace слово для ссылки, но слово не может быть уже частью привязки

У меня есть HTML-контент:

<p>
Nunc nulla tincidunt metus sed eros auctor sagittis. Sed malesuada, mi et ornare 
molestie, urna dui 
<a href="http://google.com/" title="condimentum nulla">condimentum nulla, ut luctus</a> nisl ipsum ut dui. 
Praesent aliquam velit quis neque congue consectetur <b>nulla</b>. 
Curabitur turpis risus, malesuada nec volutpat sit amet, auctor porta velit.
</p>

И я хочу заменить все слова «nulla» ссылками, но только в том случае, если «nulla» не является частью другого URL-адреса ссылки или другого параметра HTML (название, alt). В приведенном выше примере сценарий должен заменять только первое и последнее «нулевое» слово, а остальные оставлять как есть. Я застрял с этим регулярным выражением, но оно не работает так, как я хочу:

/[^<a]+[^>]*nulla[^<\/a>]/

person Luc    schedule 13.12.2011    source источник
comment
[^<...] находится на правильном пути, но с неправильным синтаксисом.   -  person mario    schedule 14.12.2011
comment
Спасибо, это решение работает для меня: $str = preg_replace('~nulla(?!(?›[^‹]*(?:‹(?!/?a\b)[^‹]*)*)‹/ a›)~i', '‹a href=novo-mega-link.php›$0‹/a›', $str);   -  person Luc    schedule 14.12.2011


Ответы (1)


Окончательное решение, которое работает как надо:

$str = preg_replace('~\bnulla\b(?!(?>[^<]*(?:<(?!/?a\b)[^<]*)*)</a>)~iu', '<a href="novo-mega-link.php">$0</a>', $str);
person Luc    schedule 14.12.2011
comment
Дайте нам знать, когда он сломается, выглядит хрупким. Вероятно, лучше использовать парсер HTML_ - person hakre; 15.12.2011
comment
Что вы имеете в виду HTML parser_? - person Luc; 16.12.2011
comment
Именно то, что предполагает этот термин: парсер для HTML. - person hakre; 16.12.2011