【问题标题】:JHtml-"email.cloak" doesn't recognize email address when using preg_replace() in joomlaJHtml-“email.cloak”在 joomla 中使用 preg_replace() 时无法识别电子邮件地址
【发布时间】:2019-01-20 19:43:25
【问题描述】:

我尝试使用 JHtml::_("email.cloak", "some@email.com") 将模块中文本中的电子邮件地址替换为 php,以便将其隐藏在 joomla 3.9.2 网页上。

使用以下示例代码:

<div>
<?php
    $text = "This is a text with some@email.com an e-mail address in it";
    $test_text_email = "some@email.com";
    echo JHtml::_("email.cloak", $test_text_email)."<br>";
    echo preg_replace('/([a-zA-Z0-9_\-\.]*@\\S+\\.\\w+)/', JHtml::_("email.cloak", "$1"),$text)."<br>";
?></div>

Jhtml:_("email.cloak",... 仅在传递简单字符串时效果很好(请参阅下面的 $test_text_email)。使用 preg_replace 在文本中搜索电子邮件地址时,可以正确找到电子邮件子字符串,但由于该函数似乎不再识别“@”符号,因此伪装无法正常工作,结果如下:

<span id="cloak7c9ea7a5340755f2f7e1d4f0c8b45675"><a href="mailto:some@email.com">some@email.com</a></span>
This is a text and <span id="cloak88a24a939973cdd7ec9f3d1fb591b7a5"><a href="mailto:some@email.com@">some@email.com@</a></span> an e-mail address 

生成的 javascript 证明了 preg_replace() 找到的正确子字符串,但没有发生任何隐藏,只是在末尾添加了一个 @ 符号(@)。

<script type="text/javascript">
            document.getElementById('cloak3fd71e407852d6d7593b726a0f41ca38').innerHTML = '';
            var prefix = '&#109;a' + 'i&#108;' + '&#116;o';
            var path = 'hr' + 'ef' + '=';
            var addy3fd71e407852d6d7593b726a0f41ca38 = 'some@email.com' + '&#64;';
            addy3fd71e407852d6d7593b726a0f41ca38 = addy3fd71e407852d6d7593b726a0f41ca38 + '';
            var addy_text3fd71e407852d6d7593b726a0f41ca38 = 'some@email.com' + '&#64;' + '';document.getElementById('cloak3fd71e407852d6d7593b726a0f41ca38').innerHTML += '<a ' + path + '\'' + prefix + ':' + addy3fd71e407852d6d7593b726a0f41ca38 + '\'>'+addy_text3fd71e407852d6d7593b726a0f41ca38+'<\/a>';
    </script>

脚本中正确的行如下所示:

    var addy1ef8a36d65e0cc59448f875761cc1465 = 's&#111;m&#101;' + '&#64;';addy1ef8a36d65e0cc59448f875761cc1465 = addy1ef8a36d65e0cc59448f875761cc1465 + '&#101;m&#97;&#105;l' + '&#46;' + 'c&#111;m';

任何想法为什么字符串的处理方式不同? 提前致谢!

【问题讨论】:

    标签: php joomla preg-replace cloaking


    【解决方案1】:

    您不能对preg_replace() 的替换参数进行操作。您需要致电preg_replace_callback()

    代码:(Demo)

    $text = "This is a text with some@email.com an e-mail address in it";
    
    echo preg_replace_callback(
            '~[\w.-]+@(?:[\w-]+\.)+\w+~',
            function($m) {
                return JHtml::_("email.cloak", $m[0]);
            },
            $text
         );
    
    • a-zA-Z0-9_ 更简单地压缩为 \w
    • . 不需要在字符类中转义。
    • 如果- 位于字符类的开头或结尾,或者紧跟在字符类中的“字符范围”之后(例如0-9-),则不需要转义。
    • 你的模式中不需要那些双斜线
    • \S 之后的贪婪 + 在某些情况下可能是个坏主意

    【讨论】:

    • 这绝对是有道理的!不敢相信我找不到“preg_replace_callback()”函数。谢谢米克马克
    猜你喜欢
    • 2013-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-21
    • 2012-04-08
    • 2016-12-27
    • 1970-01-01
    相关资源
    最近更新 更多