Coldfusion Regex将URL转换为小写

时间:2014-01-28 16:50:14

标签: regex coldfusion

我试图在一个html块中使用转换网址以确保它们是小写的。 有些链接是大写和小写的混合,需要将它们转换为小写。 围绕网站运行并重做每个链接是不可能的,因此在输出文本时希望使用正则表达式。

<p>Hello world <a href="http://www.somelink.com/HOME">Some link</a>.</p>

需要转换为:

 <p>Hello world <a href="http://www.somelink.com/home">Some link</a>.</p>

使用如下所示的ColdFusion Regex(虽然这不起作用):

<cfset content = Rereplace(content,'(http[*])','\L\1','All')>

任何帮助都非常感激。

3 个答案:

答案 0 :(得分:4)

我想我会使用小写函数lCase()。

将您的网址放入变量中,如果它还没有:

<cfset MyVar = "http://www.ThisSite.com">

强制它在这里小写:

<cfset MyVar = lCase(MyVar)>

或者在这里:

<cfoutput>
<a href="#lCase(MyVar)#">Some Link</a>
</cfoutput>

更新:实际上,我看到你实际要问的是如何生成整个HTML页面(或很大一部分)然后返回它,找到所有链接,然后降低它们的情况。那是你想要做的吗?

答案 1 :(得分:4)

由于您将HTML存储在数据库中,因此除了使用lcase()之外,还需要做更多的工作。我会将功能包装成一个可以轻松重用的功能。查看此代码以获取示例。

content = '<p>Hello world <a href="http://www.somelink.com/HOME">Some link</a>.</p>
            <p>Hello world <a href="http://www.somelink.com/TEST">Some link</a>.</p>
            <p>Hello world <a href=''http://www.somelink.com/BLARG''>Some link</a>.</p>';
writeDump( content );
writeDump( fixLinks( content ) );

function fixLinks( str ){
    var links = REMatch( 'http[^"'']*', str  );
    for( var link in links ){
        str = replace( str, link, lcase( link ), "ALL" );
    }
    return str;
}

这只在CF9&amp; CF10。

使用REMatch()可获得一系列匹配项。然后,您只需循环遍历该数组,并使用replace()lcase()将链接设为小写。

并且......基于Leigh的建议,这里是使用REReplace()

的一行代码中的解决方案
REReplace( content, '(http[^"'']*)', '\L\1', 'all' )

答案 2 :(得分:2)

使用HTML解析器解析HTML,而不是正则表达式。

以下是使用jQuery的方法:

<!doctype html>

<script src="jquery.js"></script>

<cfsavecontent variable="HtmlCode">
    <p>Hello world <a href="http://www.somelink.com/HOME">Some link</a>.</p>
</cfsavecontent>

<pre></pre>

<script>
    var HtmlCode = "<cfoutput>#JsStringFormat(HtmlCode)#</cfoutput>";

    HtmlCode = jQuery('a[href]',HtmlCode).each( lowercaseHref ).end().html();

    function lowercaseHref(index,item)
    {
        var $item = jQuery(item);

    // prevent non-links from being changed
    // (alternatively, can check for specific domain, etc)
        if ( $item.attr('href').startsWith('#') )
        return

        $item.attr( 'href' , $item.attr('href').toLowerCase() );
    }

    jQuery('pre').text(HtmlCode);
</script>

这适用于href标记上的a属性,但当然可以针对其他内容进行更新。

它会忽略<a href="#SomeId">之类的页内链接,但不会忽略<a href="/HOME/#SomeId">之类的内容 - 如果这是一个问题,则需要更新函数以排除页面片段部分(例如,拆分{{1}然后重新加入,或其他)。如果你可能有区分大小写的查询字符串,那就相同了。

当然上面只是jQuery,因为我觉得这样 - 你也可以使用服务器端的HTML解析器,比如jSoup来实现这一点。