繁体   English   中英

可以使用Regex / preg_replace为关键字添加锚标记吗?

[英]Can Regex/preg_replace be used to add an anchor tag to a keyword?

我希望能够切换这个......

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.

我不能简单地替换“关键字”的所有实例,因为有些是在现有的锚标记中使用。

注意:在Linux上使用PHP5 preg_replace。

单独使用正则表达式不能这样做。 正则表达式是无上下文的 - 它们只是匹配模式,而不考虑周围环境。 要执行您想要的操作,您需要将源解析为抽象表示,然后将其转换为目标输出。

使用正则表达式可能不是解决此问题的最佳方法,但这是一个快速解决方案:

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]”]。

同样,我会尝试找到一个不涉及正则表达式的简单解决方案。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM