JHtml-"email.cloak" 在 joomla 中使用 preg_replace() 时无法识别电子邮件地址
JHtml-"email.cloak" doesn't recognize email address when using preg_replace() in joomla
我尝试使用 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", ""),$text)."<br>";
?></div>
Jhtml:_("email.cloak",... 在仅传递一个简单的字符串时效果很好(请参阅下面的 $test_text_email)。使用 [= 在文本中搜索电子邮件地址时31=],正确找到了电子邮件子字符串,但由于该函数似乎无法再识别“@”符号,因此隐藏内容无法正常工作,结果如下:
<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 = 'ma' + 'il' + 'to';
var path = 'hr' + 'ef' + '=';
var addy3fd71e407852d6d7593b726a0f41ca38 = 'some@email.com' + '@';
addy3fd71e407852d6d7593b726a0f41ca38 = addy3fd71e407852d6d7593b726a0f41ca38 + '';
var addy_text3fd71e407852d6d7593b726a0f41ca38 = 'some@email.com' + '@' + '';document.getElementById('cloak3fd71e407852d6d7593b726a0f41ca38').innerHTML += '<a ' + path + '\'' + prefix + ':' + addy3fd71e407852d6d7593b726a0f41ca38 + '\'>'+addy_text3fd71e407852d6d7593b726a0f41ca38+'<\/a>';
</script>
脚本中正确的行如下所示:
var addy1ef8a36d65e0cc59448f875761cc1465 = 'some' + '@';addy1ef8a36d65e0cc59448f875761cc1465 = addy1ef8a36d65e0cc59448f875761cc1465 + 'email' + '.' + 'com';
知道为什么字符串的处理方式不同吗?
提前致谢!
您不能对 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
.
不需要转义字符class.
如果 -
在字符 class 的开头或结尾,或者紧跟在字符 class 的 "range of characters" 之后,则不需要转义=](例如 0-9-
)。
- 您的模式中不需要那些双斜线
\S
之后的贪婪 +
在某些情况下可能不是一个好主意
我尝试使用 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", ""),$text)."<br>";
?></div>
Jhtml:_("email.cloak",... 在仅传递一个简单的字符串时效果很好(请参阅下面的 $test_text_email)。使用 [= 在文本中搜索电子邮件地址时31=],正确找到了电子邮件子字符串,但由于该函数似乎无法再识别“@”符号,因此隐藏内容无法正常工作,结果如下:
<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 = 'ma' + 'il' + 'to';
var path = 'hr' + 'ef' + '=';
var addy3fd71e407852d6d7593b726a0f41ca38 = 'some@email.com' + '@';
addy3fd71e407852d6d7593b726a0f41ca38 = addy3fd71e407852d6d7593b726a0f41ca38 + '';
var addy_text3fd71e407852d6d7593b726a0f41ca38 = 'some@email.com' + '@' + '';document.getElementById('cloak3fd71e407852d6d7593b726a0f41ca38').innerHTML += '<a ' + path + '\'' + prefix + ':' + addy3fd71e407852d6d7593b726a0f41ca38 + '\'>'+addy_text3fd71e407852d6d7593b726a0f41ca38+'<\/a>';
</script>
脚本中正确的行如下所示:
var addy1ef8a36d65e0cc59448f875761cc1465 = 'some' + '@';addy1ef8a36d65e0cc59448f875761cc1465 = addy1ef8a36d65e0cc59448f875761cc1465 + 'email' + '.' + 'com';
知道为什么字符串的处理方式不同吗? 提前致谢!
您不能对 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
.
不需要转义字符class.
如果 -
在字符 class 的开头或结尾,或者紧跟在字符 class 的 "range of characters" 之后,则不需要转义=](例如0-9-
)。- 您的模式中不需要那些双斜线
\S
之后的贪婪+
在某些情况下可能不是一个好主意