Регулярное выражение PHP для замены слова ссылкой - PullRequest
0 голосов
/ 19 декабря 2008

У меня есть ситуация, когда я анализирую текст и заменяю определенные фразы ссылками. Затем мне нужно повторно проанализировать строку, чтобы заменить второй набор фраз ссылками. Проблема возникает в этой точке, где определенные слова или фразы во втором наборе могут быть подстроками фраз, уже замененных в первом проходе.

Пример : строка «бла-бла-гранд-каньон бла» станет «бла-бла <a href="#">grand canyon</a> бла» после первого прохода. Во втором проходе можно попытаться заменить слово «каньон» ссылкой, поэтому результирующий разорванный текст будет выглядеть так: «бла-бла <a href="#"> великий <a href="#"> каньон </a></a> бла».

Поэтому я пытался использовать preg_replace и регулярное выражение для предотвращения появления вложенных тегов <a> - заменяя только текст, которого еще нет в ссылке. Я пытался откорректировать эту проверку, основываясь на том, есть ли в тексте теги </a>, но не могу заставить их работать.

Может быть, нужен другой подход?

Большое спасибо заранее! Dave

Ответы [ 2 ]

1 голос
/ 19 декабря 2008

Это может работать для всех проходов:

$string = preg_replace('/([^>]|^)grand canyon\b/','$1<a href=#>grand canyon</a>',$string);

РЕДАКТИРОВАТЬ: при условии, что вы можете позволить себе пропустить, когда текст содержит такие вещи, как "amazonas> большой каньон"

0 голосов
/ 19 декабря 2008

Для второго прохода вы можете использовать регулярное выражение, например:

(<a[^>]*>.*?</a>)|grand

Это регулярное выражение соответствует либо ссылке, либо слову "великий". Если ссылка совпадает, она включается в первую (и единственную) группу захвата. Если группа соответствует, просто вставьте существующую ссылку. Если слово grand соответствует, вы знаете, что оно находится за пределами ссылки, и вы можете превратить его в ссылку.

В PHP вы можете сделать это с помощью preg_replace_callback:

$result = preg_replace_callback('%(<a[^>]*>.*?</a>)|grand%', compute_replacement, $subject);

function compute_replacement($groups) {
    // You can vary the replacement text for each match on-the-fly
    // $groups[0] holds the regex match
    // $groups[n] holds the match for capturing group n
    if ($groups[1]) {
        return $groups[1];
    } else {
        return "<a href='#'>$groups[0]</a>";
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...