JHtml-"email.cloak" не распознает адрес электронной почты при использовании preg_replace() в joomla
Я пытаюсь заменить адрес электронной почты в тексте в модуле с помощью PHP JHtml::_("email.cloak", "some@email.com")
, чтобы скрыть это на веб-странице 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(), но без маскировки, в конце добавляется только символ @ (& # 64).
<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';
Любые идеи, почему строки обрабатываются по-разному? Заранее спасибо!
1 ответ
Вы не можете выполнять манипуляции с параметром замены preg_replace()
, Вам нужно будет позвонить preg_replace_callback()
,
Код: ( Демо)
$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
может быть плохой идеей в некоторых сценариях