Можно ли использовать Regex / preg_replace для добавления тега привязки к ключевому слову? - PullRequest
1 голос
/ 03 января 2009

Я хотел бы иметь возможность переключить это ...

My sample [a id="keyword" href="someURLkeyword"] test keyword test[/a] link this keyword here.

Для того, чтобы ...

My sample [a id="keyword" href="someURLkeyword"] test keyword test[/a] link this [a href="url"]keyword[/a] here.

Я не могу просто заменить все экземпляры "ключевого слова", потому что некоторые из них используются в или внутри существующего тега привязки.

Примечание. Использование PHP5 preg_replace в Linux.

Ответы [ 2 ]

2 голосов
/ 06 января 2009

Использование регулярных выражений может быть не лучшим способом решения этой проблемы, но вот быстрое решение:

function link_keywords($str, $keyword, $url) {
    $keyword = preg_quote($keyword, '/');
    $url = htmlspecialchars($url);

    // Use split the string on all <a> tags, keeping the matched delimiters:
    $split_str = preg_split('#(<a\s.*?</a>)#i', $str, -1, PREG_SPLIT_DELIM_CAPTURE);

    // loop through the results and process the sections between <a> tags
    $result = '';
    foreach ($split_str as $sub_str) {
        if (preg_match('#^<a\s.*?</a>$#i', $sub_str)) {
            $result .= $sub_str;
        } else {
            // split on all remaining tags
            $split_sub_str = preg_split('/(<.+?>)/', $sub_str, -1, PREG_SPLIT_DELIM_CAPTURE);
            foreach ($split_sub_str as $sub_sub_str) {
                if (preg_match('/^<.+>$/', $sub_sub_str)) {
                    $result .= $sub_sub_str;
                } else {
                    $result .= preg_replace('/'.$keyword.'/', '<a href="'.$url.'">$0</a>', $sub_sub_str);
                }
            }
        }
    }
    return $result;
}

Общая идея - разбить строку на ссылки и все остальное. Затем разбейте все, что находится за пределами тега ссылки, на теги и простой текст и вставьте ссылки в обычный текст. Это предотвратит расширение [p class = "keyword"] до [p class = "[a href =" url "] keyword [/ a]"].

Опять же, я бы попытался найти более простое решение, не включающее регулярные выражения.

2 голосов
/ 04 января 2009

Вы не можете сделать это только с помощью регулярных выражений. Регулярные выражения не зависят от контекста - они просто соответствуют шаблону независимо от окружения. Чтобы сделать то, что вы хотите, вам нужно разобрать источник в абстрактном представлении, а затем преобразовать его в целевой выход.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...